変更可能なイテレータをサポートするおもちゃのコンテナクラスを設計したいと思いますが、イテレータのライフタイムとコンテナへの参照を並べ替えるのに問題があります。変更可能なイテレータをサポートするコンテナを実装するにはどうすればよいですか?
Iが最小非コンパイル例を作成するために試みた:
struct Payload {
value: i32,
}
struct Container {
val: Payload,
}
struct IterMut<'a> {
cont: &'a mut Container,
cnt: i32,
}
impl<'a> Container {
fn new() -> Container {
Container { val: Payload { value: 42 } }
}
fn iter_mut(&'a mut self) -> IterMut<'a> {
IterMut {
cont: self,
cnt: 10,
}
}
}
impl<'a> Iterator for IterMut<'a> {
type Item = &'a mut Payload;
fn next<'b>(&'b mut self) -> Option<Self::Item> {
self.cnt -= 1;
if self.cnt < 0 {
return None;
} else {
Some(&mut self.cont.val)
}
}
}
fn main() {
let mut cont = Container::new();
let mut it = cont.iter_mut();
it.next();
}
上記iter_mut()
を使用して上に反復するとき、同じアイテムを10回返す実際の愚かなコンテナを実装することが意図されています。
Iterator::next
の実装方法を理解できません。
私はnext
のために何をしたいのと同じセマンティクスを実装して通常の関数の書き込みを管理しなかった:私はIterator::next
を実装するためにそれを適応させるために管理することができないので、これは助けない
fn manual_next<'a, 'b>(i: &'a mut IterMut<'b>) -> Option<&'a mut Payload> {
i.cnt -= 1;
if i.cnt < 0 {
return None;
} else {
Some(&mut i.cont.val)
}
}
を、 Iterator
を実装せずに、自分のコンテナをfor-loopsで繰り返し処理することはできません。
もちろん、ああ!だから私が本当に簡単な例を作成しようとしたとき、私は誤って無効な例を作りました。 –
私の "マニュアル"ネクストメソッドが動作する理由は、そのシグネチャが同時に複数の戻り値を同時に生かすことができないためです。 Iterator-traitのnext-methodのシグネチャは何ですか? Iteratorの特性は、next()が同じ可変参照を2回返さないことを約束します。しかし、私の実装はまさにそうしようとしていました。 –
はい、そうです。私はそれをカバーするために私の答えに少し追加しました。 –