这是基于我之前的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
被认为是可变借来的。
答案 0 :(得分:7)
当您将foo
声明为
fn foo(&'a mut self) {}
您说self
的可变借用与嵌入式字符串具有相同的生存期'a
。因此,只要该结构存在,它就保持借用状态。调用foo
就像绝对放弃了该结构的所有权。
您可以通过将foo
声明为
fn foo(&mut self) {}