rust - 为什么无法编译?

标签 rust borrow-checker

我试图获取对链表尾部的引用,这是我编写的代码:

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/

相关文章:

rust - 如何在可变引用结构中为字段交换新值?

multithreading - 如何将 JoinHandle 存储在与自身运行的线程的结构中?

rust - 如何在可变借用后打印出一个值?

rust - 为什么这个可变借用超出了它的范围?

rust - 为什么通过提取方法进行重构会触发借用检查器错误?

rust - 为什么这个特征/实现不兼容 - 绑定(bind)生命周期与具体生命周期

rust - 尝试使用Rust tokio Framed LinesCodec写入服务器

rust - 如何启用 Rust "crate feature"?

rust - 如何发出 GET 请求并打印结果?

rust - 无法从闭包返回值中移出借用的内容