首先,让代码说话:
#[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.
不能编译呢?虽然有许多类似标题的问题,但我无法明确将其识别为重复项(除了错误消息相同之外),可能是因为我不理解Rust中的所有权/借用系统。
qux
,那么我需要在每个地方都添加该逻辑。也许我需要使用宏?...我知道HashMap
和Vec
类型有一个get_mut
方法,也许可以从它们的实现中学到一些东西。我将不得不再深入研究一下。 - Felix Schlitter