本文简要介绍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 Iterator.copied用法及代码示例
- Rust Iterator.count用法及代码示例
- Rust Iterator.cmp用法及代码示例
- Rust Iterator.cmp_by用法及代码示例
- Rust Iterator.chain用法及代码示例
- Rust Iterator.cloned用法及代码示例
- Rust Iterator.cycle用法及代码示例
- Rust Iterator.skip_while用法及代码示例
- Rust Iterator.max_by_key用法及代码示例
- Rust Iterator.is_sorted用法及代码示例
- Rust Iterator.is_partitioned用法及代码示例
- Rust Iterator.intersperse用法及代码示例
- Rust Iterator.scan用法及代码示例
- Rust Iterator.min用法及代码示例
- Rust Iterator.find_map用法及代码示例
- Rust Iterator.peekable用法及代码示例
- Rust Iterator.rev用法及代码示例
- Rust Iterator.product用法及代码示例
- Rust Iterator.any用法及代码示例
- Rust Iterator.max用法及代码示例
- Rust Iterator.by_ref用法及代码示例
- Rust Iterator.min_by用法及代码示例
- Rust Iterator.inspect用法及代码示例
- Rust Iterator.min_by_key用法及代码示例
- Rust Iterator.intersperse_with用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::iter::Iterator.collect。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。