本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。