【发布时间】:2021-12-01 08:28:45
【问题描述】:
我正在尝试更详细地了解 Rust 的所有权和生命周期,但我对这段代码感到非常困惑:
let mut lst = vec![1, 2, 3];
let mut x = &mut 0;
for value in &mut lst {
*value += 1;
*x += 1;
x = value;
}
*x += 1;
println!("{:?}", &lst);
据我了解,Rust 不允许对任何值有多个可变引用,并且对向量中元素的可变引用也借用了向量本身。所以不可能同时对向量中的两个元素进行可变引用。
但是在上面的代码中,循环体存储了一个可变引用,该引用对循环外的lst 中的元素进行了更改。然后,在下一次迭代中,它需要 another 对 lst 中不同元素的可变引用,同时给我 两个 对列表中两个元素的可变引用。
所以我的问题是:为什么允许这样做?
【问题讨论】:
-
您不仅可以同时获得对两个不同元素的可变引用。您可以同时获得对 all 元素的可变引用:
lst.iter_mut().collect::<Vec<_>>()。这是有效的,因为来自迭代器的每个可变引用都是不同的。就像您可以同时对结构中的不同字段进行可变引用一样。