На самом деле нет кода, который может пойти в это пространство, чтобы исправить это;вам нужно будет внести некоторые большие изменения.
Одна из проблем заключается в том, что вы заимствовали текущий узел в current_node
, но затем нужно изменить его, пока эта ссылка еще существует.
Используя нелексические времена жизни в Выпуске 2018, вы можете сделать:
impl LinkedList {
fn remove(&mut self, v: usize) -> Option<usize> {
let mut current = &mut self.head;
loop {
match current {
None => return None,
Some(node) if node.v == v => {
*current = node.next.take();
return Some(v);
},
Some(node) => {
current = &mut node.next;
}
}
}
}
}
Каким-то образом, используя защитную скобу if node.v == v
для создания двух спичечных ветвей, вместо использования условия if
внутриодна спичечная рука позволяет заемщику определить, что это безопасно.Я не уверен, почему оператор if
внутри плеча матча не разрешен - есть мнение, что может быть ошибкой .