我希望 struct 的字段是Iterator
除以T
个元素,但是Iterator
没有类型参数.我知道我正试图做一些根本错误的事情,但是呢?
我希望 struct 的字段是Iterator
除以T
个元素,但是Iterator
没有类型参数.我知道我正试图做一些根本错误的事情,但是呢?
在Rust中,Iterator
(更具体地说是Iterator<Item = T>
,其中T
是迭代时产生的类型)是trait.表示迭代器的类型实现了这个特性.
这是一个更一般的问题"如何在 struct 中存储特征值?"的实例.我故意用一种不精确的方式来表达这个问题——我们真正想要的是存储一个type implementing the 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<_>>());
另一种做同样事情的方法是使用通用 struct ,同时避免在堆上分配任何框.这样我们将有一些类型实现Iterator<Item = T>
,具体是什么将在编译时确定.
定义:
struct IteratorHolder<I: Iterator<Item = u32>> {
iter: I,
}
用法:
let ih = IteratorHolder { iter: 0..10 };
println!("{:?}", ih.iter.collect::<Vec<_>>());