我有一个结构:
struct Quads<'a> {
mx: &'a Vec<Vec<u32>>,
xs: &'a mut Peekable<Range<i32>>,
ys: &'a mut Peekable<Range<i32>>,
dx: i32,
dy: i32,
}
我希望xs
的类型是Peekable<dyn Iterator<Item = i32>>
的,因为这在其他语言中是很自然的。这样的想法可以在 Rust 中表达吗?
也就是说,"i32
的某些Iterator
的Peekable
",而不是特定Iterator
的Peekable
.
Peekable<dyn Iterator<Item = i32>>
的问题在于dyn Trait
动态(显然(表示一个类型,这意味着它是一个动态大小的类型。这些不能直接表示为结构字段(除非通过晦涩的方式(。
因此,@edwardw的评论是要走的路。将迭代器放在Box
可确保字段具有固定大小,但迭代器本身可以是它想要的任何大小。 如果内容实现Iterator
,Box
自然也会实现Iterator
。以下是更改(也遵循您在其他问答中的领导,它们应该直接存储,而不是作为&mut
参考(:
struct Quads<'a> {
mx: &'a Vec<Vec<u32>>,
xs: Peekable<Box<dyn Iterator<Item = i32>>>,
ys: Peekable<Box<dyn Iterator<Item = i32>>>,
dx: i32,
dy: i32,
}
然后,您可以通过Box::new(0..dx) as Box<dyn Iterator<Item = i32>>
(游乐场(创建。
如果预期的混凝土类型是Range<i32>
那么这可能不是问题,但是如果您确实想存储更多需要生存期的奇特迭代器,那么您可能需要添加+ 'a
约束,如以下答案所示: 如何使Box<dyn Iterator>
可窥视并避免生命周期错误?