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

标签 rust reference option-type

我有一个结构:

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/

相关文章:

ios - NSNumber 类型的托管属性?没有初始化为 nil

reference - 借用的值在循环中的生命周期不够长

c - 使用Clang将C++库编译为wasm失败,找不到 'stdlib.h'文件错误

rust - 在 `PhantomData`的实现中 `Vec`到底在做什么?

java - 在 Java 中使用可变引用创建不可变类

haskell - 无法将预期类型 `Int' 与实际类型 `m0 Int' 匹配

enums - ws-rs : E0271r: expected (), 找到枚举 `std::result::Result`

java - 为父类(super class)分配一个引用java

css - 在 CSS 中使用对象引用

javascript - 从javascript中的可选设置中读取可选属性