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


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