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

标签 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

代码减少了很多,以至于它没有做任何有用的事情,并且可以通过例如从 foo 函数中删除 'a 生命周期来修复。但我想了解为什么代码不正常。

我的理解是 MyStruct 包含对某个生命周期 'astr 的引用,并且可以调用 foo self 指向同一生命周期的 MyStruct。我不明白为什么 m 在第一次调用 foo 后被认为是可变借用的。

最佳答案

当您将 foo 声明为

 fn foo(&'a mut self) {}

你说 self 的可变借用具有与嵌入字符串相同的生命周期 'a。所以只要结构存在,它就会一直被借用。调用 foo 就像绝对放弃结构的所有权。

您可以通过将 foo 声明为

来修复它
 fn foo(&mut self) {}

关于struct - 为什么我不能多次调用变异函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56060983/

相关文章:

C enum 打印错误?

c - 错误 : variable ‘database’ has initializer but incomplete type?

rust - 宏匹配 token 递归扩展

rust - 如何在 Rust 中以编程方式读取属性

string - 交替使用 str 和 String

c++ - 哪个 union 成员在安置新人后变得活跃

c# - 具有自动实现属性和构造函数初始值设定项的结构

json - 如何用 Go 结构体来表示这个复杂的数据结构?

rust - `unsafe` 函数的最佳实践是什么,其中只有一小部分代码实际上在做 `unsafe` 的事情?