@
w568w 看了你的例子,我开始以为关键是生命周期:another_mut_a 的生命周期被 mut_a 包括在内,而 mut_a 又被 a 包括,所以代码不出错。
我刚刚把我主楼最后代码的变量创建换个位置,试了试下面这个代码,也能正常运行不报错
```rust
fn main() {
let mut v = (136, 139);
let m = &mut v;
let m1 = &mut m.1;
m.0 = 137;
*m1 = 42;
println!("{:?}", v)
}
```
我本来以为在使用 m1 之前访问了 m.0 ,相当于 m1 和 m 的生命周期重叠了一部分,所以应该报错。
但事实没有,而如果我在 m.0 和*m1 之间加上一句`println!("{:?}", m);`,就会报错。
我想,按照书中的概念,v 是所有权树的父节点,v.0 和 v.1 是其子节点,有了父节点的&mut 后,可以在此基础上&mut 子节点;使用时只要使用&mut 子节点时,若使用的子节点之间生命周期没有重叠,就能够正常用(就像本楼例子和主楼最后);但如果在&mut 子节点生命周期没结束时直接使用&mut 父节点,就会因为生命周期重叠导致同时有两个方式访问同一个&mut ,所以会报错。
你那个例子的感觉像是生命周期正好层层被包住所以没有冲突,不知道我这样理解对不对?