`*(&'一个mut self)`方法中的生命周期参数是否会混淆BorrowChecker?

时间:2015-03-22 18:03:25

标签: rust

只要在'a中使用&'a mut self,就不会编译以下示例:

struct Foo<'a> {
    a: &'a u64,
}

impl<'a> Foo<'a> {
    fn mutate_internal(&'a mut self) {}

    fn mutate(&'a mut self) {
        self.mutate_internal();
        self.mutate_internal(); // <- This call fails the borrow-check
    }
}

编译器使我惊讶于以下错误消息:

tests/lang.rs:1116:13: 1116:17 error: cannot borrow `*self` as mutable more than once at a time
tests/lang.rs:1116             self.mutate_internal();
                               ^~~~
tests/lang.rs:1115:13: 1115:17 note: previous borrow of `*self` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `*self` until the borrow ends
tests/lang.rs:1115             self.mutate_internal();
                               ^~~~
tests/lang.rs:1117:10: 1117:10 note: previous borrow ends here
tests/lang.rs:1114         fn mutate(&'a mut self) {
tests/lang.rs:1115             self.mutate_internal();
tests/lang.rs:1116             self.mutate_internal();
tests/lang.rs:1117         }
                           ^

你能解释一下为什么会这样吗?请注意,如果&'a mut self变为&mut self,问题就会消失。

✗ rustc --version
rustc 1.0.0-nightly (e2fa53e59 2015-03-20) (built 2015-03-20)

1 个答案:

答案 0 :(得分:8)

如果您将'a命名生命周期放在mutate_internal中,您获得的是一个新的(匿名)生命周期参数,而不是'a。即你得到的东西相当于:

fn mutate_internal<'b>(&'b mut self) {}

这意味着自己被借用直到mutate_internal完成,但不会超过这个。这就是第二次调用mutate_internal编译的原因。

相比之下,使用fn mutate_internal(&'a mut self) {},你告诉编译器只要'a(这是Foo的整个生命周期)就会借用self。这就是为什么不能调用第二个mutate_internal