Rust 无法分配给';node.next';因为它是在引用已经超出范围时借用的

Rust 无法分配给';node.next';因为它是在引用已经超出范围时借用的,rust,Rust,我试图编写一个简单的链表,但在尝试实现删除时遇到了这个问题。我无法分配给变量,因为它是借用的,即使引用超出范围 struct Node<T> { next: Option<Box<Node<T>>>, value: T, } 这似乎是一个编译器错误,有一个与此问题相关的已回答问题:,这更好地解释了问题的根源: 如果只有一条执行路径终止循环,则无法为借用分配正确的生存期 在您的示例中,从循环内部泄漏借用值next(通过将其分配给节点

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

struct Node<T> {
    next: Option<Box<Node<T>>>,
    value: T,
}

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

如果只有一条执行路径终止循环,则无法为借用分配正确的生存期

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

让mut节点=头部;
环路{
设next=node.next.as_mut().unwrap();
如果让None=next.next{
打破
}否则{
node=node.next.as_mut().unwrap();
}
}
node.next=None;

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

如果只有一条执行路径终止循环,则无法为借用分配正确的生存期

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

让mut节点=头部;
环路{
设next=node.next.as_mut().unwrap();
如果让None=next.next{
打破
}否则{
node=node.next.as_mut().unwrap();
}
}
node.next=None;

@Anler是对的。我正在写另一个答案,因为如果
LinkedList
为空,那么您的代码将陷入恐慌。这是有问题的一行:

let head=self.head.as_mut().unwrap();
如果
self.head
None
(空列表)->
unwrap()
将死机。下面是一个工作示例(
loop
->
while
):

fn删除(&mut self){
让head=匹配self.head.as_mut(){
一些(头)=>头,
无=>返回,
};
对头,下一个{
None=>self.head=None,
一些())=>{
让mut节点=头部;
while node.next.as_ref().unwrap().next.is_some(){
node=node.next.as_mut().unwrap();
}
node.next=None;
}
};
}

@Anler是对的。我正在写另一个答案,因为如果
LinkedList
为空,那么您的代码将陷入恐慌。这是有问题的一行:

let head=self.head.as_mut().unwrap();
如果
self.head
None
(空列表)->
unwrap()
将死机。下面是一个工作示例(
loop
->
while
):

fn删除(&mut self){
让head=匹配self.head.as_mut(){
一些(头)=>头,
无=>返回,
};
对头,下一个{
None=>self.head=None,
一些())=>{
让mut节点=头部;
while node.next.as_ref().unwrap().next.is_some(){
node=node.next.as_mut().unwrap();
}
node.next=None;
}
};
}

链表很少有“简单”的地方,至少在锈迹斑斑的情况下是如此。请阅读。链表很少有“简单”的地方,至少在锈迹斑斑的地方是这样的。请阅读。
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