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


Rust Iterator.collect用法及代码示例


本文简要介绍rust语言中 std::iter::Iterator.collect 的用法。

用法

fn collect<B>(self) -> B where    B: FromIterator<Self::Item>,

将迭代器转换为集合。

collect() 可以接受任何可迭代的内容,并将其转换为相关的集合。这是标准库中更强大的方法之一,用于各种上下文。

使用collect() 的最基本模式是将一个集合转换为另一个集合。你拿一个集合,在上面调用 iter ,做一堆转换,最后是collect()

collect() 还可以创建非典型集合类型的实例。例如,可以从 char 构建 String ,并且可以将 Result<T, E> 项的迭代器收集到 Result<Collection<T>, E> 中。有关更多信息,请参见下面的示例。

由于 collect() 非常通用,因此可能会导致类型推断问题。因此, collect() 是您少数会看到被亲切地称为 'turbofish': ::<> 的语法之一。这有助于推理算法具体了解您试图收集到哪个集合。

例子

基本用法:

let a = [1, 2, 3];

let doubled: Vec<i32> = a.iter()
                         .map(|&x| x * 2)
                         .collect();

assert_eq!(vec![2, 4, 6], doubled);

请注意,我们需要左侧的: Vec<i32>。这是因为我们可以收集到例如 VecDeque<T> 中:

use std::collections::VecDeque;

let a = [1, 2, 3];

let doubled: VecDeque<i32> = a.iter().map(|&x| x * 2).collect();

assert_eq!(2, doubled[0]);
assert_eq!(4, doubled[1]);
assert_eq!(6, doubled[2]);

使用 'turbofish' 而不是注释 doubled

let a = [1, 2, 3];

let doubled = a.iter().map(|x| x * 2).collect::<Vec<i32>>();

assert_eq!(vec![2, 4, 6], doubled);

因为 collect() 只关心您收集到的内容,您仍然可以使用部分类型提示 _ 和 turbofish:

let a = [1, 2, 3];

let doubled = a.iter().map(|x| x * 2).collect::<Vec<_>>();

assert_eq!(vec![2, 4, 6], doubled);

使用 collect() 制作 String

let chars = ['g', 'd', 'k', 'k', 'n'];

let hello: String = chars.iter()
    .map(|&x| x as u8)
    .map(|x| (x + 1) as char)
    .collect();

assert_eq!("hello", hello);

如果您有 Result<T, E> 的列表,您可以使用 collect() 查看是否有任何失败:

let results = [Ok(1), Err("nope"), Ok(3), Err("bad")];

let result: Result<Vec<_>, &str> = results.iter().cloned().collect();

// gives us the first error
assert_eq!(Err("nope"), result);

let results = [Ok(1), Ok(3)];

let result: Result<Vec<_>, &str> = results.iter().cloned().collect();

// gives us the list of answers
assert_eq!(Ok(vec![1, 3]), result);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::iter::Iterator.collect。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。