2016-06-29 15 views
3

私は単純なバイナリ検索ツリーを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 
     }) 
    } 
} 

答えて

5

あなたはOption<&'a mut Node<T>>にフィールドIterMut::nextの種類を変更する必要があります。

pub struct IterMut<'a, T: 'a> { 
    next: Option<&'a mut Node<T>>, 
} 

impl<'a, T> Iterator for IterMut<'a, T> { 
    type Item = &'a mut T; 
    fn next(&mut self) -> Option<Self::Item> { 
     self.next.take().map(|node| { 
      self.next = node.right.0.as_mut().map(|node| &mut **node); 
      &mut node.elem 
     }) 

    } 
} 

あなたがここに再帰的なデータ構造のための可変イテレータの実装についてのより有用な情報を見つけることができます:http://cglab.ca/~abeinges/blah/too-many-lists/book/second-iter-mut.html

+1

優秀なリンク!これを安全に書くことはできませんでした(もちろん、OPのツリー構造には完全な反復に必要なバックリファレンスがありません)。 –

+0

ニース!私はツリーを使用することによってそれがわからなかった私は不要なボックスを使用していた。 借用ルールの動作を完全に視覚化することはまだできませんが、共有のイテレータ(&T)を使用すると、コードが機能していたので、不要なBoxを捕捉しませんでした。 –

1

私はあなたには、いくつかの危険なコードを使用せずに2つの可変オブジェクト(Itemに1つ、self自体の1)にselfを分割することはできませんと思います

+1

それが必要作業。これもうまくいく: 'let mut x = Box :: new((3、5)); let(ref mut a、ref mut b)= * ref_mut.deref_mut(); '(奇妙なことに、' 'ref_mut''はrhs ...で動作しません。それは安全でなければならず、安全でないコードがなければ動作するはずですが、私は今でもうまく動作しません:/ –

関連する問題