我大致有以下代码:
let val = util::replace(&mut self.some_field[i], self.some_method());
它失败并显示以下消息:
unrelated.rs:61:65: 61:70 error: cannot borrow `*self` as immutable because it is also borrowed as mutable
unrelated.rs:61 let val = util::replace(&mut self.some_field[i], self.some_method());
^~~~~
unrelated.rs:61:36: 61:62 note: second borrow of `*self` occurs here
unrelated.rs:61 let val = util::replace(&mut self.some_field[i], self.some_method());
^~~~~~~~~~~~~~~~~~~~~~~
我可以通过以下代码解决这个问题:
let temp = self.some_method();
let val = util::replace(&mut self.some_field[i], temp);
但为什么会失败?可变和不可变指针的范围是不同的,它们是不同的表达式。对我来说这看起来有点像虫子,但我只是想确保我在这里不会遗漏一些东西。
答案 0 :(得分:2)
通过引入temp
,您已经更改了计算顺序:首先计算some_method()
,然后释放self
,然后获得some_field
self
的可变引用}}
Rust不允许保留可变引用以及任何其他引用(可变或不可变)。见更简单的例子:
struct Foo {
a: int
}
impl Foo {
fn ff(&self) -> int { 1 }
}
fn fff(a: int, foo: &mut int) { }
fn ggg(foo: &mut int, a: int) { }
fn main() {
let mut foo = Foo { a: 0 };
fff(foo.ff(), &mut foo.a); // this call is valid
ggg(&mut foo.a, foo.ff()); // this is not
}
答案 1 :(得分:1)
这个 是一个错误:#6268。
这是因为借用检查器还没有正确考虑嵌套方法调用:嵌套调用应该等同于临时代码(因此应该是有效的)。