为什么编译失败?
Why does this fail to compile?
我正在尝试获取对链表尾部的引用,这是我编写的代码:
pub struct ListNode {
pub next: Option<Box<ListNode>>,
}
fn tail(mut head: &mut Option<Box<ListNode>>) -> &mut Option<Box<ListNode>> {
while let Some(x) = head.as_mut() {
head = &mut x.next;
}
head
}
编译失败是因为它认为我两次借用 head 是可变的。我能够通过将其更改为以下内容来进行编译:
fn tail(mut head: &mut Option<Box<ListNode>>) -> &mut Option<Box<ListNode>> {
while head.is_some() {
head = &mut head.as_mut().unwrap().next;
}
head
}
在我看来,这两个函数做的事情完全相同,但第一个函数看起来干净多了。为什么不编译?有比我改成的更好的方法吗?
您已经拥有正确引用类型的值,因此 as_mut
是不必要的。
while let Some(x) = head {
head = &mut x.next;
}
head
我不能说为什么你的第一个例子没有编译,因为我自己仍然不是说“借用检查器”的专家,但我的猜测是 Rust 只是保守并假设 head.as_mut()
借用持续到变量 x
中,它被放入 head
,因此是一个可变借用,持续时间与 head
一样长,而当我们像我一样直接访问它时执行以上操作,Rust 足够聪明,可以理解真正发生的事情。
我正在尝试获取对链表尾部的引用,这是我编写的代码:
pub struct ListNode {
pub next: Option<Box<ListNode>>,
}
fn tail(mut head: &mut Option<Box<ListNode>>) -> &mut Option<Box<ListNode>> {
while let Some(x) = head.as_mut() {
head = &mut x.next;
}
head
}
编译失败是因为它认为我两次借用 head 是可变的。我能够通过将其更改为以下内容来进行编译:
fn tail(mut head: &mut Option<Box<ListNode>>) -> &mut Option<Box<ListNode>> {
while head.is_some() {
head = &mut head.as_mut().unwrap().next;
}
head
}
在我看来,这两个函数做的事情完全相同,但第一个函数看起来干净多了。为什么不编译?有比我改成的更好的方法吗?
您已经拥有正确引用类型的值,因此 as_mut
是不必要的。
while let Some(x) = head {
head = &mut x.next;
}
head
我不能说为什么你的第一个例子没有编译,因为我自己仍然不是说“借用检查器”的专家,但我的猜测是 Rust 只是保守并假设 head.as_mut()
借用持续到变量 x
中,它被放入 head
,因此是一个可变借用,持续时间与 head
一样长,而当我们像我一样直接访问它时执行以上操作,Rust 足够聪明,可以理解真正发生的事情。