Can anyone explain why the following code will compile, but if I comment out one line then it does not, even though the code is essentially doing the same thing?
struct OtherStruct {
x: i32,
}
struct Inner {
blah: i32,
vector: Vec<OtherStruct>
}
struct Outer {
inner: Inner,
}
impl Inner {
pub fn set_blah(&mut self, new_val : i32) {
self.blah = new_val;
}
}
fn main() {
let mut outer = Outer {
inner: Inner {
blah: 10,
vector: vec![
OtherStruct { x: 1 },
OtherStruct { x: 2 },
OtherStruct { x: 3 },
OtherStruct { x: 4 },
OtherStruct { x: 5 },
]
}
};
for item in outer.inner.vector.iter() {
println!("{}", item.x);
outer.inner.blah = 4;
//outer.inner.set_blah(6);
}
}
The compiler error is:
|
34 | for item in outer.inner.vector.iter() {
| -------------------------
| |
| immutable borrow occurs here
| immutable borrow later used here
...
37 | outer.inner.set_blah(6);
| ^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
Which makes sense to me, I guess I'm wondering why I'm allowed to get away with it when I don't use a function call, surely the same mutability issues arise?
set_blah
needs to borrow the entire Inner
struct object. The assignment to blah
only needs to borrow the field itself, which works because it has not been borrowed yet.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With