首先,讓代碼說話:不能借用`self.x`爲永恆不變的,因爲`* self`也借爲可變
#[derive(Debug)]
struct Bar;
#[derive(Debug)]
struct Qux {
baz: bool
}
#[derive(Debug)]
struct Foo {
bars: Vec<Bar>,
qux: Qux,
}
impl Foo {
fn get_qux(&mut self) -> &mut Qux {
&mut self.qux
}
fn run(&mut self) {
// 1. Fails:
let mut qux = self.get_qux();
// 2. Works:
// let mut qux = &mut Qux { baz: false };
// 3. Works:
// let mut qux = &mut self.qux;
let qux_mut = &mut qux;
qux_mut.baz = true;
for bar in &self.bars {
println!("{:?}", bar);
}
}
}
fn main() {
println!("Hello, world!");
let mut foo = Foo { bars: vec!(), qux: Qux { baz: false } };
foo.run();
}
此錯誤:
error[E0502]: cannot borrow `self.bars` as immutable because `*self` is also borrowed as mutable
--> src/main.rs:33:21
|
22 | let mut qux = self.get_qux();
| ---- mutable borrow occurs here
...
33 | for bar in &self.bars {
| ^^^^^^^^^ immutable borrow occurs here
...
36 | }
| - mutable borrow ends here
如果我取消或者2.
或3.
,它爲什麼編譯得很好? 1.
中的被調用函數與2.
或3.
沒有任何大的差異。那麼爲什麼1.
無法編譯?
雖然有many similar titled questions,但是我不能清楚地將其識別爲僞指令(除了錯誤信息是相同的),可能是因爲我對Rust的所有權/借用系統缺乏瞭解。
謝謝您的詳細解答。然而,我想知道,如果必須的話,如何在for循環中使用'qux'? –
@FelixSchlitter已更新。 – Shepmaster
我明白了。但是讓我們假設該函數有一些額外的邏輯,例如它需要一個id並從quux的vec中檢索到'qux',然後我需要在任何地方添加該邏輯。也許我需要訴諸宏觀? ...我知道'HashMap'和'Vec'類型有一個'get_mut'方法,也許有些東西需要從它們的實現中學習。我將不得不再次下潛。 –