如何在结构中保存任何迭代器的可窥视?



我有一个结构:

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的某些IteratorPeekable",而不是特定IteratorPeekable.

Peekable<dyn Iterator<Item = i32>>的问题在于dyn Trait动态(显然(表示一个类型,这意味着它是一个动态大小的类型。这些不能直接表示为结构字段(除非通过晦涩的方式(。

因此,@edwardw的评论是要走的路。将迭代器放在Box可确保字段具有固定大小,但迭代器本身可以是它想要的任何大小。 如果内容实现IteratorBox自然也会实现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>可窥视并避免生命周期错误?