【问题标题】:Why does a for loop not require a mutable iterator?为什么 for 循环不需要可变迭代器?
【发布时间】:2018-04-30 01:37:12
【问题描述】:

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

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 循环之前是不可变的,然后它是不可访问的,所以没关系。

对吗?还有什么要解释的吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

    完全正确。由于它已移至 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2018-07-05
      相关资源
      最近更新 更多