我有一个结构:
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()
时会发生自动取消引用.
nb:我用作提醒 « ref
在 =
的左侧类似于 &
在右侧 »,但这里我们要添加 &
在 Option
内,因此使用.as_ref()
或.as_mut()
取决于预期的可变性。
关于rust - 无法从对选项的可变引用后面移出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64348004/