奇怪的借用检查失败

时间:2013-08-06 15:01:23

标签: pointers rust

我大致有以下代码:

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);

但为什么会失败?可变和不可变指针的范围是不同的,它们是不同的表达式。对我来说这看起来有点像虫子,但我只是想确保我在这里不会遗漏一些东西。

2 个答案:

答案 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

这是因为借用检查器还没有正确考虑嵌套方法调用:嵌套调用应该等同于临时代码(因此应该是有效的)。