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()し、次に を解放し、 of へのself変更可能な参照を取得しました。some_fieldself

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 に答える