2016-10-28 3 views
2

ループ内の変数を再割り当てしようとしていますが、実行中はcannot assign to `cur_node` because it is borrowedです。以下では、単純化のためにループをコメントしました。同じ問題です。これをどうすれば処理できますか?変数が借用されているため、変数に代入することができません

fn naive_largest_path(root: Rc<RefCell<Node>>) { 
    let mut cur_node = root.clone(); 
    let cur_node_borrowed = cur_node.borrow(); 

    // while cur_node_borrowed.has_children() { 
     let lc = cur_node_borrowed.left_child.as_ref().unwrap(); 

     let left_child = cur_node_borrowed.left_child.as_ref().unwrap(); 
     let right_child = cur_node_borrowed.right_child.as_ref().unwrap(); 

     let left_val = left_child.borrow().value; 
     let right_val = right_child.borrow().value; 

     if left_val > right_val { 
      cur_node = left_child.clone(); 
     } else { 
      cur_node = right_child.clone(); 
     } 
    // } 
} 

struct Node { 
    value: i32, 
    row_num: i32, 
    position_in_row: i32, 
    left_child: Option<Rc<RefCell<Node>>>, 
    right_child: Option<Rc<RefCell<Node>>>, 
} 

impl Node { 
    fn new(val: i32, row: i32, pos_in_row: i32) -> Rc<RefCell<Node>> { 
     Rc::new(RefCell::new(Node { 
      value: val, 
      row_num: row, 
      position_in_row: pos_in_row, 
      left_child: None, 
      right_child: None, 
     })) 
    } 

    fn has_children(&self) -> bool { 
     self.left_child.is_some() || self.right_child.is_some() 
    } 
} 
+1

唯一の解決策は、問題を回避する方法で、コードを書き換えることです。

はここで錆のブロック-ある-表現が特色を生かして、コンパイルする一つの方法です。 'Node'が何であるか、そしてこの関数の出力として得ることが期待されるものについてのいくつかの詳細は非常に貴重です(質問の中で編集してください)。 –

+1

これは正しい用語ではありません(私はせいぜい錆の初心者です)が、あなたの 'cur_node_borrowed'が' cur_node'の変更可能な借用の所有権を持っているように見えます。ですから、あなたが一番下に降りると、 'cur_node_borrowed'が有効範囲に入っている間に' cur_node'を再度変更しようとしています。スコープの外にある 'cur_node_borrowed'を押して、変更可能な借用を失った場合、再びcur_nodeに割り当てることができます。 (私はちょうどあなたがそれを行うための最善の方法を知らない、申し訳ありません)。これが正しい方向にあなたを指してくれることを願っています。 – Ross

+0

@MatthieuM、Nodeの実装を追加しました。目標は、子供の最大値に基づいて、ノードのベクトルを返すことです。私は簡潔にするためにそれを削除しました。 – Newtang

答えて

3

コメントが言ったように、あなたがcur_nodeに割り当てる時点ではボローがないことを確認するためにコードを再構築する必要があります。 Rcを扱う場合は、.clone()をいくつか追加するだけでよく逃げることができますが、それは不正行為です(そして少し効率的ではありません):-)。

fn naive_largest_path(root: Rc<RefCell<Node>>) { 

    let mut cur_node = root.clone(); 

    while cur_node.borrow().has_children() { 
     cur_node = { 
      let cur_node_borrowed = cur_node.borrow(); 

      let lc = cur_node_borrowed.left_child.as_ref().unwrap(); 

      let left_child = cur_node_borrowed.left_child.as_ref().unwrap(); 
      let right_child = cur_node_borrowed.right_child.as_ref().unwrap(); 



      let left_val = left_child.borrow().value; 
      let right_val = right_child.borrow().value; 


      if left_val > right_val { 
       left_child.clone() 
      } else { 
       right_child.clone() 
      } 
     }; 
    } 
} 
関連する問題