gpt4 book ai didi

rust - 无法从对 Option 的可变引用后面移出

转载 作者:行者123 更新时间:2023-12-03 11:28:31 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Cannot move out of value which is behind a shared reference when unwrapping

(2 个回答)



How to unwrap a &Result<_,_>?

(1 个回答)


1年前关闭。




我有一个结构:

struct Foo<'a> {
parent: Option<&'a mut Foo<'a>>,
value: i32,
}

impl<'a> Foo<'a> {
fn bar(&mut self) {
if let Some(&mut parent) = self.parent {
parent.bar();
} else {
self.value = 1;
}
}
}
但我得到了错误:
error[E0507]: cannot move out of `*self.parent.0` which is behind a mutable reference
--> src/lib.rs:8:36
|
8 | if let Some(&mut parent) = self.parent {
| ------ ^^^^^^^^^^^ help: consider borrowing here: `&self.parent`
| |
| data moved here
| move occurs because `parent` has type `Foo<'_>`, which does not implement the `Copy` trait

error[E0596]: cannot borrow `parent` as mutable, as it is not declared as mutable
--> src/lib.rs:9:13
|
8 | if let Some(&mut parent) = self.parent {
| ------ help: consider changing this to be mutable: `mut parent`
9 | parent.bar();
| ^^^^^^ cannot borrow as mutable
我已经尝试了该行的许多变体,但无法使其正常工作。我怎样才能做到这一点?

最佳答案

在您的 if let您试图解构的声明self.parent获取parent ,甚至得到Foo (本身,作为一个值)在存储的引用后面。
您必须添加额外的间接级别来引用 &mut Foo可能存在也可能不存在,无需将其从 Option 中删除如果存在。

if let Some(ref mut parent) = self.parent {
或者
if let Some(parent) = self.parent.as_mut() {
parent您在这两种情况下获得的绑定(bind)类型为 &mut &'a mut Foo<'a> , 因此调用 parent.bar() 时会发生自动取消引用.
注意:我用作提醒 « ref= 的左侧类似于 &在右侧»,但在这里我们要添加 &里面 Option ,因此使用 .as_ref().as_mut()取决于预期的可变性。

关于rust - 无法从对 Option 的可变引用后面移出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64348004/

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