当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。