我如何转换这样的东西:
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的副本而不是可变的引用?如果是这样的话,我如何获得可变的引用?
发布于 2015-02-21 21:13:21
您的代码取消变量(*i),然后向它添加一个变量。在任何地方,原始值都不会改变。
按照您的要求,最好的方法是使用Iterator::for_each
a.iter_mut().for_each(|i| *i += 1);这将获得对向量中数字的可变引用的迭代器。对于每个项,它取消引用,然后递增引用。
您可以使用map和collect,但是这样做是非惯用的和潜在的浪费。这使用map作为变异原始值的副作用。赋值的“返回值”是单元类型() --一个空元组。我们使用collect::<Vec<()>>强制Iterator适配器进行迭代。最后一位::<...>被称为涡轮鱼类,允许我们为collect调用提供一个类型参数,通知它要使用什么类型,因为没有其他任何东西会限制返回类型:
let _ = a.iter_mut().map(|i| *i += 1).collect::<Vec<()>>();您还可以使用像Iterator::count这样的东西,它比创建Vec更轻,但最终还是不需要的:
a.iter_mut().map(|i| *i += 1).count();作为Ry- says,使用for循环更为惯用:
for i in &mut a {
*i += 1;
}https://stackoverflow.com/questions/28651259
复制相似问题