2

我大致有以下代码:

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

但为什么会失败?可变指针和不可变指针的作用域是不同的,它们是不同的表达式。对我来说,这看起来像是一种错误,但我只是想确保我没有在这里遗漏任何东西。

4

2 回答 2

2

通过介绍temp你已经改变了计算顺序:你首先计算some_method(),然后释放self,然后得到一个可变引用some_fieldof 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
}
于 2013-08-06T15:45:40.967 回答
1

一个错误:#6268

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

于 2013-08-07T07:05:53.907 回答