rust – 为什么for循环不需要可变迭代器?

如果我想手动使用迭代器,它必须是可变的:

let test = vec![1, 2, 3];
let mut test_mut = test.iter();
while let Some(val) = test_mut.next() {
    println!("{:?}", val);
}

但我可以愉快地使用for循环来使用它,即使它是不可变的.

let test = vec![1, 2, 3];
let test_imm = test.iter();
for val in test_imm {
    println!("{:?}", val);
}

我认为这是有效的,因为test_imm被移动到for循环的块中,因此外部块不能再使用test_imm,并且(从外部块的角度来看)不可变直到for循环,然后它是无法访问,所以没关系.

是对的吗?还有更多要解释的吗?

这是完全正确的.因为它被移动到for循环,所以for循环现在拥有它并且可以随心所欲地做任何事情,包括“使它”变得可变.考虑这个类似的例子,我们似乎在改变xs尽管它是不可变的,但实际上它是因为我们正在移动它,所以新的所有者可以随意使用它,包括将其重新绑定为可变:

let xs: Vec<i32> = vec![1, 2, 3];

fn append(v: Vec<i32>, x: i32) -> Vec<i32> {
    let mut my_v = v;
    my_v.push(x);
    my_v
}

let appended = append(xs, 4);

playground

请注意,使用mut参数便捷语法可以缩短函数:

fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> {
    v.push(x);
    v
}

这或多或少地解释了in the iter module’s documentation.

https://stackoverflow.com/questions/30360269/why-does-a-for-loop-not-require-a-mutable-iterator

转载注明原文:rust – 为什么for循环不需要可变迭代器?