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


Rust FromIterator用法及代碼示例


本文簡要介紹rust語言中 Trait std::iter::FromIterator 的用法。

用法

pub trait FromIterator<A> {
    fn from_iter<T>(iter: T) -> Self    where        T: IntoIterator<Item = A>;
}

Iterator 轉換。

通過為類型實現FromIterator,您可以定義如何從迭代器創建它。這對於說明某種集合的類型很常見。

FromIterator::from_iter() 很少被顯式調用,而是通過 Iterator::collect() 方法使用。有關更多示例,請參閱 Iterator::collect() 的文檔。

另請參閱: IntoIterator

例子

基本用法:

use std::iter::FromIterator;

let five_fives = std::iter::repeat(5).take(5);

let v = Vec::from_iter(five_fives);

assert_eq!(v, vec![5, 5, 5, 5, 5]);

使用 Iterator::collect() 隱式使用 FromIterator

let five_fives = std::iter::repeat(5).take(5);

let v: Vec<i32> = five_fives.collect();

assert_eq!(v, vec![5, 5, 5, 5, 5]);

為您的類型實現FromIterator

use std::iter::FromIterator;

// A sample collection, that's just a wrapper over Vec<T>
#[derive(Debug)]
struct MyCollection(Vec<i32>);

// Let's give it some methods so we can create one and add things
// to it.
impl MyCollection {
    fn new() -> MyCollection {
        MyCollection(Vec::new())
    }

    fn add(&mut self, elem: i32) {
        self.0.push(elem);
    }
}

// and we'll implement FromIterator
impl FromIterator<i32> for MyCollection {
    fn from_iter<I: IntoIterator<Item=i32>>(iter: I) -> Self {
        let mut c = MyCollection::new();

        for i in iter {
            c.add(i);
        }

        c
    }
}

// Now we can make a new iterator...
let iter = (0..5).into_iter();

// ... and make a MyCollection out of it
let c = MyCollection::from_iter(iter);

assert_eq!(c.0, vec![0, 1, 2, 3, 4]);

// collect works too!

let iter = (0..5).into_iter();
let c: MyCollection = iter.collect();

assert_eq!(c.0, vec![0, 1, 2, 3, 4]);

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::iter::FromIterator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。