无法弄清楚Rust的借用检查器是如何处理这个例子的

时间:2017-06-14 04:14:15

标签: rust borrow-checker

我有以下代码(从我的代码中减去了一点),递归遍历可变列表,直到达到某个条件。

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 个答案:

没有答案