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


Rust IntoIterator用法及代碼示例


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

用法

pub trait IntoIterator {
    type Item;
    type IntoIter: Iterator;
    fn into_iter(self) -> Self::IntoIter;
}

轉換為 Iterator

通過為類型實現IntoIterator,您可以定義如何將其轉換為迭代器。這對於說明某種集合的類型很常見。

實施的好處之一IntoIterator你的類型會使用 Rust 的 for 循環語法.

另請參閱: FromIterator

例子

基本用法:

let v = vec![1, 2, 3];
let mut iter = v.into_iter();

assert_eq!(Some(1), iter.next());
assert_eq!(Some(2), iter.next());
assert_eq!(Some(3), iter.next());
assert_eq!(None, iter.next());

為您的類型實現IntoIterator

// 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 IntoIterator
impl IntoIterator for MyCollection {
    type Item = i32;
    type IntoIter = std::vec::IntoIter<Self::Item>;

    fn into_iter(self) -> Self::IntoIter {
        self.0.into_iter()
    }
}

// Now we can make a new collection...
let mut c = MyCollection::new();

// ... add some stuff to it ...
c.add(0);
c.add(1);
c.add(2);

// ... and then turn it into an Iterator:
for (i, n) in c.into_iter().enumerate() {
    assert_eq!(i as i32, n);
}

通常使用 IntoIterator 作為 trait bound。這允許輸入集合類型改變,隻要它仍然是一個迭代器。可以通過限製 Item 來指定其他邊界:

fn collect_as_strings<T>(collection: T) -> Vec<String>
where
    T: IntoIterator,
    T::Item: std::fmt::Debug,
{
    collection
        .into_iter()
        .map(|item| format!("{:?}", item))
        .collect()
}

相關用法


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