修改`iter_mut()。map(..)`中的self,也称为可变功能集合操作

时间:2015-02-21 20:58:43

标签: iterator rust

如何转换这样的内容:

let mut a = vec![1,2,3,4i32];    
for i in a.iter_mut() {
    *i += 1;
}

使用Map和闭包进行一行操作?

我试过了:

a.iter_mut().map(|i| *i + 1).collect::<Vec<i32>>();

以上情况仅在我将其重新分配给a时才有效。为什么是这样? map是否获得a的副本而不是可变参考?如果是这样,我怎样才能获得可变参考?

1 个答案:

答案 0 :(得分:3)

您的代码取消引用变量(*i),然后添加一个变量。没有任何地方原始值会被更改。这就是您所要求的,但我不建议这样做!

a.iter_mut().map(|i| *i += 1).collect::<Vec<()>>();

这将获得对向量中数字的可变引用的迭代器。对于每个项目,它使用map来改变原始值的副作用。赋值的“返回值”是单位类型() - 一个空元组。我们使用collect::<Vec<()>>强制Iterator适配器进行迭代。最后一位::<...>允许我们为collect调用提供类型参数,告知它使用什么类型,因为没有其他条件会限制返回类型。

作为minitech says,这可能更好,并且更具表现力:

for i in a.iter_mut() { *i += 1; }