当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。