當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Rust Iterator.flatten用法及代碼示例

本文簡要介紹rust語言中 std::iter::Iterator.flatten 的用法。

用法

fn flatten(self) -> Flatten<Self> where    Self::Item: IntoIterator,

創建一個扁平化嵌套結構的迭代器。

當您有一個迭代器的迭代器或一個可以轉換為迭代器的事物的迭代器並且您想要刪除一個間接級別時,這很有用。

例子

基本用法:

let data = vec![vec![1, 2, 3, 4], vec![5, 6]];
let flattened = data.into_iter().flatten().collect::<Vec<u8>>();
assert_eq!(flattened, &[1, 2, 3, 4, 5, 6]);

映射然後展平:

let words = ["alpha", "beta", "gamma"];

// chars() returns an iterator
let merged: String = words.iter()
                          .map(|s| s.chars())
                          .flatten()
                          .collect();
assert_eq!(merged, "alphabetagamma");

您也可以根據 flat_map() 重寫它,在這種情況下更可取,因為它更清楚地傳達了意圖:

let words = ["alpha", "beta", "gamma"];

// chars() returns an iterator
let merged: String = words.iter()
                          .flat_map(|s| s.chars())
                          .collect();
assert_eq!(merged, "alphabetagamma");

Flattening 一次隻刪除一層嵌套:

let d3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]];

let d2 = d3.iter().flatten().collect::<Vec<_>>();
assert_eq!(d2, [&[1, 2], &[3, 4], &[5, 6], &[7, 8]]);

let d1 = d3.iter().flatten().flatten().collect::<Vec<_>>();
assert_eq!(d1, [&1, &2, &3, &4, &5, &6, &7, &8]);

在這裏,我們看到 flatten() 不執行 “deep” 展平。相反,隻刪除了一層嵌套。也就是說,如果你flatten() 一個三維數組,結果將是二維的而不是一維的。要獲得一維結構,您必須再次flatten()

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::iter::Iterator.flatten。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。