gpt4 book ai didi

rust - 无法分配给 'node.next',因为它在引用已经超出范围时被借用

转载 作者:行者123 更新时间:2023-11-29 08:20:01 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的链表,但在尝试实现删除时遇到了这个问题。我无法分配给变量,因为它是借用的,即使引用超出范围也是如此。

struct Node<T> {
next: Option<Box<Node<T>>>,
value: T,
}
struct LinkedList<T> {
head: Option<Box<Node<T>>>,
}
fn remove(&mut self) {
let head = self.head.as_mut().unwrap();
if let None = head.next {
self.head = None;
} else {
let mut node = head;
loop {
let next = node.next.as_mut().unwrap();
if let None = next.next {
break;
} else {
node = next;
}
}
node.next = None;
}
}
error[E0506]: cannot assign to `node.next` because it is borrowed
--> linkedlist.rs:49:13
|
42 | let next = node.next.as_mut().unwrap();
| --------- borrow of `node.next` occurs here
...
49 | node.next = None;
| ^^^^^^^^^
| |
| assignment to borrowed `node.next` occurs here
| borrow later used here

最佳答案

这似乎是一个编译器错误,有一个与此问题相关的已回答问题:Rust lifetime issue in loop ,这更好地解释了问题的根源:

It can't assign a correct lifetime to the borrow if only one execution path terminates the loop.

在您的示例中,从循环内部泄漏借用的值 next(通过将其分配给 node)将导致问题,因为存在条件循环终止,因此为了解决这个问题,不要泄漏借用的值,而是在分配给 node 时重新借用:

let mut node = head;
loop {
let next = node.next.as_mut().unwrap();
if let None = next.next {
break;
} else {
node = node.next.as_mut().unwrap();
}
}
node.next = None;

关于rust - 无法分配给 'node.next',因为它在引用已经超出范围时被借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57566309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com