一个结构如何才能既拥有序列又拥有序列上的迭代器?

时间:2019-06-09 08:06:41

标签: rust iterator immutability lifetime ownership

我正在尝试构造一个Defiler结构,该结构拥有固定的序列和描述此序列中当前位置的内部状态。想法是可以对其进行迭代,但是有时可以将其重置为序列的开头。

我选择了一个迭代器作为内部状态来表示序列的当前值。这个想法是,当需要重置时,它将被丢弃并由新的迭代器代替。

这是到目前为止我最不喜欢的尝试:

use std::slice::IterMut;

struct Defiler<'a> {
    // This sequence should not change during the whole
    // lifetime of the struct, although I have not expressed it yet.
    seq: Vec<u32>,
    // Internal state pointing towards the next element to be
    // yielded. It will be randomly replaced by a fresh one.
    current: IterMut<'a, u32>,
    // ...
}

impl<'a> Defiler<'a> {

    fn new(mut seq: Vec<u32>) -> Self {
        Defiler {
            seq,
            current: seq.iter_mut(), // move out of borrowed value, of course.
        }
    }

    // Restart the iteration from scratch.
    fn reset(&'a mut self) {
        self.current = self.seq.iter_mut();
    }

    // ...

}

我了解为什么上面的内容无法编译,并且我知道我没有表达过很多希望编译器放心的事情:

  • 即使其内部值是可变的,seq也不会在Defiler的整个生命周期中增长或收缩。
  • current永远只会迭代seq中拥有的值。
  • =>我敢肯定,不会产生任何悬空的迭代。

我怎么写呢?

0 个答案:

没有答案