gpt4 book ai didi

iterator - 修改 `iter_mut().map(..)` 中的 self ,又名可变函数集合操作

转载 作者:行者123 更新时间:2023-11-29 08:00:02 24 4
gpt4 key购买 nike

我如何转换这样的东西:

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 的副本而不是可变引用吗?如果是这样,我如何获得可变引用?

最佳答案

您的代码取消对变量 ( *i ) 的引用,然后将其加一。 原始值 的任何地方都没有改变。

完成您要求的最佳方法是使用 Iterator::for_each :

a.iter_mut().for_each(|i| *i += 1);

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

您可以使用 mapcollect ,但这样做不合惯用且可能造成浪费。这使用 map 来产生改变原始值的副作用。赋值的“返回值”是单元类型 ()——一个空元组。我们使用 collect::<Vec<()>> 来强制 Iterator 适配器进行迭代。最后一点 ::<...> 称为 turbofish 并允许我们为 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;
}

关于iterator - 修改 `iter_mut().map(..)` 中的 self ,又名可变函数集合操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com