我希望结构的字段是T
元素上的Iterator
,但是Iterator
没有类型参数。我知道我正在尝试做一些根本错误的事情,但是呢?
最佳答案
在 Rust 中,Iterator
(更具体地说 Iterator<Item = T>
,其中 T
是迭代时产生的类型)是一个 trait。表示迭代器的类型实现了这个特征。
这是更普遍的问题“如何在结构中存储特征值?”的一个实例。我故意以一种不精确的方式表达了这个问题——我们真正想要的是存储一个实现特征的类型的值,并且有两种方法可以做到这一点。
放在盒子里
最简单的方法是使用 Box<Iterator<Item = T>>
. Box
代表一个拥有的指针,当你有一个指向特征对象的指针时,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<_>>());
关于rust - 我如何让结构的字段成为 `Iterator` 超过 `T` 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47838596/