首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在`iter_mut().map(.)`,也就是可变函数集合操作中修改self

在`iter_mut().map(.)`,也就是可变函数集合操作中修改self
EN

Stack Overflow用户
提问于 2015-02-21 20:58:43
回答 1查看 8K关注 0票数 14

我如何转换这样的东西:

代码语言:javascript
复制
let mut a = vec![1, 2, 3, 4i32];
for i in a.iter_mut() {
    *i += 1;
}

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

我试过:

代码语言:javascript
复制
a.iter_mut().map(|i| *i + 1).collect::<Vec<i32>>();

只有当我将其重新分配到a时,上面的内容才能起作用。为什么会这样呢?map是否获得a的副本而不是可变的引用?如果是这样的话,我如何获得可变的引用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-21 21:13:21

您的代码取消变量(*i),然后向它添加一个变量。在任何地方,原始值都不会改变。

按照您的要求,最好的方法是使用Iterator::for_each

代码语言:javascript
复制
a.iter_mut().for_each(|i| *i += 1);

这将获得对向量中数字的可变引用的迭代器。对于每个项,它取消引用,然后递增引用。

您可以使用mapcollect,但是这样做是非惯用的和潜在的浪费。这使用map作为变异原始值的副作用。赋值的“返回值”是单元类型() --一个空元组。我们使用collect::<Vec<()>>强制Iterator适配器进行迭代。最后一位::<...>被称为涡轮鱼类,允许我们为collect调用提供一个类型参数,通知它要使用什么类型,因为没有其他任何东西会限制返回类型:

代码语言:javascript
复制
let _ = a.iter_mut().map(|i| *i += 1).collect::<Vec<()>>();

您还可以使用像Iterator::count这样的东西,它比创建Vec更轻,但最终还是不需要的:

代码语言:javascript
复制
a.iter_mut().map(|i| *i += 1).count();

作为Ry- says,使用for循环更为惯用:

代码语言:javascript
复制
for i in &mut a {
    *i += 1;
}
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28651259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档