为什么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);

操场

请注意,可以使用mut参数便捷语法来简化该函数:

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

这或多或少说明了在iter模块的文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 JavaScript for 循环中的迭代器不需要分号?

为什么可变对象不需要双指针?

什么是 For 循环?为什么在 R 中不需要它?

为什么在结束“循环”时“中断”不需要分号?

为什么不需要staticmethod装饰器?

为什么链接器正在寻找不需要的库

为什么我们不需要在某些 Rust 迭代器中从 Result 中提取值?

为什么键入可变长度的元组需要省略号,而List却不需要?

为什么不需要开玩笑?

为什么“ typeof”不需要括号?

* ngFor为什么不需要括号?

为什么保存Vec :: get_mut结果的变量不需要是可变的?

为什么说我们不需要克隆一个不可变类?

为什么我不需要显式借用借来的可变变量?

为什么编译器需要.java后缀,但解释器不需要.class后缀?

为什么for循环不需要显式指定循环变量的值集?

为什么Iterator :: all都需要迭代器是可变的?

为什么 for 循环不要求迭代器是可变的?

为什么数据集的foreach方法不需要编码器,而map需要?

为什么C编程需要编译器而shell脚本不需要?

为什么while循环不需要用户在c ++中输入

从向量不需要的值打印迭代器

为什么Java需要接口而Smalltalk不需要接口?

为什么`head`需要`()`和`shape`不需要?

为什么在使用GLFW时不需要加载着色器?

为什么SIP服务器不需要此INVITE的授权?

为什么我的f:selectItems不需要自定义转换器?

为什么我不需要在邮件中指定SMTP服务器?

为什么后增量不需要复制而预增量不需要复制