Не могу понять, как 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()код также компилируется.

Что здесь происходит?

0 ответов

Другие вопросы по тегам