我有以下代码(从我的代码中减去了一点),递归遍历可变列表,直到达到某个条件。
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()
,则代码也会编译。
这里发生了什么?