如何将一个struct的字段作为`Iterator`而不是`T`元素?

时间:2017-12-15 19:15:46

标签: rust

我希望结构字段为IteratorT元素,但Iterator没有类型参数。我知道我试图做一些根本错误的事情,但是这是什么?

1 个答案:

答案 0 :(得分:6)

在Rust中,Iterator(更具体地说Iterator<Item = T>其中T是迭代时产生的类型)是 trait 。表示迭代器的类型实现了这个特性。

这是一个更一般的问题的实例“如何在结构中存储特征的值?”。我故意以不精确的方式表达这个问题 - 我们真正想要的是存储实现特征的类型的值,并且有两种方法可以做到这一点。

将它放在一个框

最简单的方法是使用Box<Iterator<Item = T>>Box表示拥有的指针,当你有一个指向trait对象的指针时,Rust会创建一个“胖指针”,其中包含有关该类型的运行时信息。这样,迭代器的具体类型在编译时是未知的。

定义如下:

struct IteratorHolder {
    iter: Box<Iterator<Item = u32>>,
}

用法:

let ih = IteratorHolder { iter: Box::new(0..10) };
println!("{:?}", ih.iter.collect::<Vec<_>>());

泛型

另一种做同样事情的方法是避免在堆上分配任何框,这是使用通用结构。这样我们将有一些类型实现Iterator<Item = T>,具体将在编译时确定。

定义:

struct IteratorHolder<I: Iterator<Item = u32>> {
    iter: I,
}

用法:

let ih = IteratorHolder { iter: 0..10 };
println!("{:?}", ih.iter.collect::<Vec<_>>());