私は単純なバイナリ検索ツリーをRustに実装しました(CIS 198に従ってください)。学習のために、右端を通るイテレータをやっています。バイナリ検索ツリーの&mut反復子を実装する方法は?
私は、可変参照を与えるイテレータを実装できませんでした。私はたくさんの方法を試しましたが、どれもRustコンパイラでは受け入れられませんでした。私は助けを必要とする以下のコードは、1(while I made a gist with the complete code here)です:
#[derive(Debug)]
pub struct Tree<T>(Option<Box<Node<T>>>);
#[derive(Debug)]
pub struct Node<T> {
elem: T,
left: Tree<T>,
right: Tree<T>,
}
// MUTABLE BORROW STRUCT
pub struct IterMut<'a, T: 'a> {
next: &'a mut Tree<T>,
}
// MUTABLE BORROW NEXT (I'M STUCK HERE, NOTHING WORKS)
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
// 1 try: cannot infer lifetime
self.next.0.as_mut().map(|node| {
self.next = &mut node.right;
&mut node.elem
})
// 2 try: node.right, node.elem does not live long enough
self.next.0.take().map(|node| {
self.next = &mut node.right;
&mut node.elem
})
}
}
優秀なリンク!これを安全に書くことはできませんでした(もちろん、OPのツリー構造には完全な反復に必要なバックリファレンスがありません)。 –
ニース!私はツリーを使用することによってそれがわからなかった私は不要なボックスを使用していた。 借用ルールの動作を完全に視覚化することはまだできませんが、共有のイテレータ(&T)を使用すると、コードが機能していたので、不要なBoxを捕捉しませんでした。 –