如何在for循环中进行可变借用?

28

我尝试了:

fn main() {
    let mut vec = [1, 2, 3];
    
    for mut x in &vec { *x = 3; }
    for mut &x in &vec { x = 3; }
    for mut *x in &vec { x = 3; }
    for mut x in mut &vec { *x = 3; }
    for mut x in &(mut vec) { *x = 3; }
}

这些都不起作用,我该怎么做?

我遇到了以下错误:

  • mut 必须附加到每个单独的绑定
  • 预期标识符,发现 *
  • 预期表达式,发现关键字 mut
  • 无法对位于 & 引用后面的 *x 进行赋值
1个回答

38

您可能需要重新阅读Rust编程语言,特别是以下部分:

We can also iterate over mutable references to each element in a mutable vector in order to make changes to all the elements. The for loop in Listing 8-9 will add 50 to each element.

let mut v = vec![100, 32, 57];
for i in &mut v {
    *i += 50;
}

Listing 8-9: Iterating over mutable references to elements in a vector

To change the value that the mutable reference refers to, we have to use the dereference operator (*) to get to the value in i before we can use the += operator.

此外,你可以调用 iter_mut 方法:


let mut v = vec![100, 32, 57];
for i in v.iter_mut() {
    *i += 50;
}

另请参阅:


注意,您的变量不是向量,而是数组。

谢谢。我完全错过了for mut x in &(mut vec)的无括号版本。 - ZisIsNotZis
如果您已经有一个可变的切片,例如 v: &mut [u32] 作为函数参数,则 for i in v { *i += 50; }v.iter_mut() 相同。(我不知道是否有任何微妙的差异,但它编译方式相同。) - Peter Cordes
我理解什么是可变性,但我不明白为什么一个变量作为循环参数应该是可变的,因为它实际上是不可变的(即只读,不会改变)。 - flm
@flm Rust中的可变性是分层的 - 为了改变Vec内部的值,您还需要能够改变Vec本身。编译器不知道/不向用户公开这样一个事实:改变Vec的一个元素并不需要改变Vec本身的数据。 - Shepmaster
@Shepmaster,好的我明白了。i是一个数组项,在循环内部被改变,这就是为什么原始数组v被标记为可变的,因为它的值在此循环内部被改变。 - flm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接