如果我想手工使用迭代器,则它必须是可变的:
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);
请注意,可以使用mut
参数便捷语法来简化该函数:
fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> {
v.push(x);
v
}
这或多或少说明了在iter
模块的文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句