如果我想手动使用迭代器,它必须是可变的:
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循环,然后它不可访问,所以它没关系。
是吗?还有更多要解释的吗?
答案 0 :(得分:10)
这完全正确。由于它已经转移到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);
请注意,使用mut
参数便捷语法可以缩短函数:
fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> {
v.push(x);
v
}
这或多或少地解释了in the iter
module's documentation。