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», а «cur_node_borrowed» - в области. Нажатие '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() 
      } 
     }; 
    } 
} 
Смежные вопросы