将对struct属性的引用绑定到返回可变引用的函数中的变量

时间:2018-07-17 15:03:36

标签: rust

此代码:

struct A {
    x: i32
}

struct B {
    y: A
}

impl B {
    pub fn new(y: A) -> Self {
        B {y: y}
    }

    pub fn fn1(&mut self) -> &mut Self {
        let z = &self.y;
        println!("{:?}", z.x);
        self
    }
}

fn main() {
    let a = A {x: 10};
    B::new(a).fn1();
}

产生此错误:

Compiling playground v0.0.1 (file:///playground)
error[E0502]: cannot borrow `*self` as mutable because `self.y` is also borrowed as immutable
  --> src/main.rs:17:9
   |
15 |         let z = &self.y;
   |                  ------ immutable borrow occurs here
16 |         println!("{:?}", z.x);
17 |         self
   |         ^^^^ mutable borrow occurs here
18 |     }
   |     - immutable borrow ends here

这是一个简化的示例,代码更复杂。我想创建一个var,该var是对结构属性的引用。相关部分是:

pub fn fn1(&mut self) -> &mut Self {
    let z = &self.y;
    println!("{:?}", z.x);
    self
}

如果我不使用本地变量z而直接使用self.y.x,则可以使用它:

pub fn fn1(&mut self) -> &mut Self {
    println!("{:?}", self.y.x);
    self
}

假设我的代码稍微复杂一点,并且我想使用一个临时变量,该临时变量引用该结构的一个属性(又名B),是否可以将z设置为self.y而不复制y的内容? (所以我认为我需要参考,因为我不想复制)。

也许我的问题不够清楚,可以随时提出,如果需要,我可以进行编辑!抱歉,如果它是重复的。也很抱歉标题。

0 个答案:

没有答案