- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在解决一些 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/
我是一名优秀的程序员,十分优秀!