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

Rust 为什么for循环不需要可变迭代器?,rust,Rust,如果我想手动使用迭代器,它必须是可变的: 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

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

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\u imm
被移动到for循环的块中,所以外部块不能再使用
test\u 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);
这或多或少得到了解释

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