rust - 循环中的多个可变引用

标签 rust lifetime ownership

我正在尝试更详细地了解 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 不允许对任何值有一个以上的可变引用,并且对向量中元素的可变引用也会借用向量本身。因此,不可能同时对向量中的两个元素进行可变引用。

但在上面的代码中,循环体在循环外的 x 中存储了对 lst 中元素的可变引用。然后,在下一次迭代中,它采用 另一个lst 中不同元素的可变引用,为 两个 中的两个元素提供可变引用一次列出。

所以我的问题是:为什么允许这样做?

最佳答案

虽然 Rust 不允许您对同一值有多个可变引用,但它确实允许您对同一值的非重叠部分有可变引用。

例如,你可以拆分一个&mut T为每个字段分成单独的可变引用,借用检查器将为您跟踪这一点:

struct Foo {
    x: i32,
    y: i32,
}

let mut foo = Foo { x: 0, y : 0 };

let foo_mut = &mut foo;
let x = &mut foo_mut.x;
let y = &mut foo_mut.y;

*x = 1;
*y = 2;

println!("x = {:?}", x);     // 1
println!("y = {:?}", y);     // 2
println!("foo = {:?}", foo); // Foo { x: 1, y: 2 }

同样,您可以拆分可变切片引用 &mut [T]使用类似 split_at_mut 的方法和 split_first_mut ,它们都为您提供了两个对切片的非重叠可变引用。

事实上,可以使用split_first_mut 实现可变切片的迭代。 :

let mut lst = vec![1, 2, 3];
let mut x = &mut 0;

let mut rest = &mut *lst;
while let Some((value, rest_)) = rest.split_first_mut() {
    rest = rest_;

    *value += 1;
    *x += 1;
    x = value;
}

*x += 1;
println!("{:?}", &lst);

所以&mut [T]的迭代器没问题(和 &mut Vec<T> )提供多个共存的可变引用,只要这些可变引用指向向量的不同部分并且不重叠。

关于rust - 循环中的多个可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69545670/

相关文章:

rust - 使用#![no_std] 时如何导出 Copy?

image - 来自 SubImage<&DynamicImage> 的动态图像

vector - 如何返回对添加到特征对象向量的具体类型的引用?

rust - 如何重载引用运算符?

rust - rust E0597 : borrowed value does not live lnog enough

rust - 如何在不取得所有权的情况下替换结构字段的值

c# - 委托(delegate)的问题

rust - 函数指针的生命周期是 <'a, ' _> 而它应该是 <'r>

rust - 为什么不能在同一结构中存储值和对该值的引用?

c++ - xerces_3_1 adoptNode() 方法返回 NULL