为什么我不能多次调用变异函数?

时间:2019-05-09 13:51:45

标签: struct rust lifetime borrow-checker

这是基于我之前的question

我的代码因借阅检查器错误而失败,因此我尽可能地减少了代码。结果是:

struct MyStruct<'a> {
    s: &'a str,
}

impl<'a> MyStruct<'a> {
    fn foo(&'a mut self) {}
}

fn main() {
    let mut m = MyStruct { s: "aaa" };

    m.foo();
    m.foo();
}

失败:

error[E0499]: cannot borrow `m` as mutable more than once at a time
  --> src/main-x.rs:13:5
   |
12 |     m.foo();
   |     - first mutable borrow occurs here
13 |     m.foo();
   |     ^
   |     |
   |     second mutable borrow occurs here
   |     first borrow later used here

代码减少得如此之多,以至于它无济于事,例如可以通过从'a函数中删除foo生存期来进行修复。但是我想理解为什么代码不正确。

我的理解是MyStruct包含对str一生的'a的引用,可以用foo指向self的方式调用MyStruct寿命相同我不知道为什么在第一次调用m之后,foo被认为是可变借来的。

1 个答案:

答案 0 :(得分:7)

当您将foo声明为

 fn foo(&'a mut self) {}

您说self的可变借用与嵌入式字符串具有相同的生存期'a。因此,只要该结构存在,它就保持借用状态。调用foo就像绝对放弃了该结构的所有权。

您可以通过将foo声明为

来解决此问题。
 fn foo(&mut self) {}