gpt4 book ai didi

rust - 为什么在 `tail` 循环后仍然借用了 `while let Some() = xxx`?

转载 作者:行者123 更新时间:2023-12-04 12:14:55 25 4
gpt4 key购买 nike

我一直在解决一些 leetcode 问题,遇到了无法解释的问题。
Here is the full source code:

#[derive(Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}

impl ListNode {
fn new(val: i32) -> Self {
ListNode { next: None, val }
}
}

fn main() {
let mut list = Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 2,
next: Some(Box::new(ListNode { val: 3, next: None })),
})),
}));

let mut tail = &mut list.as_mut().unwrap().next;

// This compiles fine
// while tail.is_some() {
// tail = &mut tail.as_mut().unwrap().next;
// }

// This compiles fine
// while let Some(ref mut node) = tail {
// tail = &mut node.next;
// }

// However this does not
while let Some(node) = tail.as_mut() {
tail = &mut node.next;
}

*tail = Some(Box::new(ListNode::new(4)));
println!("{:#?}", list);
}
这是错误:
error[E0506]: cannot assign to `*tail` because it is borrowed
--> src/main.rs:39:5
|
35 | while let Some(node) = tail.as_mut() {
| ---- borrow of `*tail` occurs here
...
39 | *tail = Some(Box::new(ListNode::new(4)));
| ^^^^^
| |
| assignment to borrowed `*tail` occurs here
| borrow later used here

为什么是 tail还借了 while let Some() = xxx环形 ?

最佳答案

这是由于while let ...的相互作用和 scrutinee tail.as_mut()在那while let ,它是位置表达式上下文中的值表达式。
简单来说,为了while let的正文循环才能访问绑定(bind)( node ),编译器需要借用 tail (在循环之前创建),调用 as_mut()Option ,保留隐含的 temporary借那个 Option活着(!),并绑定(bind)值 as_mut()返回 node ;据编译器所知,node 的生命周期取决于 Option ,因为它是通过 &'a mut tail -> as_mut(&'a mut self) -> &'a mut ListNode 漏斗的.
当您重新分配时 tail = &mut node.next ,这仍然是隐式生命周期的值 'a ,借用循环创建的原始临时文件。
当您分配给 *tail 时循环后,发生冲突:原Option上有隐式借用,用于调用 as_mut()先创建 node然后 tail ,但现在您正在分配 - 就编译器而言 - 那个选项 .但是你不能使Option无效当它被借用时,因此发生错误。
这就是为什么编译器指向 borrow of *tail occurs here (注意取消引用)在 while let 的审查位置-loop 然后 - 令人困惑地 - 指向 *tail = Some(...)是使用借用的点。
其他两个示例编译良好,因为在被审查者中没有临时创建来执行 Option 上的方法调用。 .

关于rust - 为什么在 `tail` 循环后仍然借用了 `while let Some() = xxx`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69154162/

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