如何转换这样的内容:
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
的副本而不是可变参考?如果是这样,我怎样才能获得可变参考?
答案 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; }