我试图获取对链表尾部的引用,这是我编写的代码:
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
}
这无法编译,因为它认为我是两次可变地借用头。我可以通过将其更改为以下内容进行编译: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足够聪明,可以了解实际发生的情况。
关于rust - 为什么无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65894176/