Не могу понять, как Rust's заемщик работает на этом примере
У меня есть следующий код (немного потерянный из кода, который у меня был), который рекурсивно перебирает изменяемый список, пока не будет выполнено определенное условие.
struct Node {
value: usize,
next: Option<Box<Node>>,
}
fn recursive<'a>(link: &'a mut Option<Box<Node>>) -> Option<&'a mut Option<Box<Node>>> {
{
match link.as_mut() {
None => (),
Some(cur) => {
let next: &mut Option<Box<Node>> = &mut cur.next;
return recursive(next);
}
}
}
return Some(link);
}
fn main() {
}
Но код не компилируется со следующим сообщением об ошибке:
error[E0499]: cannot borrow `*link` as mutable more than once at a time
--> <anon>:16:17
|
7 | match link.as_mut() {
| ---- first mutable borrow occurs here
...
16 | return Some(link);
| ^^^^ second mutable borrow occurs here
17 | }
| - first borrow ends here
Я думал, что этот код будет работать, потому что первый заем @ строки соответствия link.as_mut()
закончится, как только матч будет завершен, таким образом, link
может быть заимствован снова. Это неверно?
Если я изменю код, чтобы не использовать сопоставление с образцом, но использовать link.as_mut().unwrap()
код также компилируется.
Что здесь происходит?