Rust 是不是有办法将函数/方法应用于数组或向量中的每个元素?
Posted
技术标签:
【中文标题】Rust 是不是有办法将函数/方法应用于数组或向量中的每个元素?【英文标题】:Does Rust have a way to apply a function/method to each element in an array or vector?Rust 是否有办法将函数/方法应用于数组或向量中的每个元素? 【发布时间】:2015-12-28 14:07:54 【问题描述】:Rust 语言是否有办法将函数应用于数组或向量中的每个元素?
我知道在 Python 中有 map()
函数可以执行此任务。在 R 中有 lapply()
、tapply()
和 apply()
函数也可以做到这一点。
Rust 中是否有既定的方法来向量化函数?
【问题讨论】:
给你:doc.rust-lang.org/std/iter/trait.Iterator.html#method.map 你可以像这样使用它:vec![1, 2, 3].into_iter().map(|x| x * 2).collect::<Vec<_>>()
【参考方案1】:
Rust 有 Iterator::map
,所以你可以:
some_vec.iter().map(|x| /* do something here */)
但是,Iterator
s 是懒惰的,所以它本身不会做任何事情。您可以在末尾添加 .collect()
以使用新元素创建一个新向量,如果这是您想要的:
let some_vec = vec![1, 2, 3];
let doubled: Vec<_> = some_vec.iter().map(|x| x * 2).collect();
println!(":?", doubled);
执行副作用的标准方法是使用for
循环:
let some_vec = vec![1, 2, 3];
for i in &some_vec
println!("", i);
如果副作用应该修改适当的值,您可以使用可变引用的迭代器:
let mut some_vec = vec![1, 2, 3];
for i in &mut some_vec
*i *= 2;
println!(":?", some_vec); // [2, 4, 6]
如果你真的想要函数式风格,可以使用.for_each()
方法:
let mut some_vec = vec![1, 2, 3];
some_vec.iter_mut().for_each(|i| *i *= 2);
println!(":?", some_vec); // [2, 4, 6]
【讨论】:
说史蒂夫,我只是想知道迭代器/收集方法与for
循环之间是否存在性能差异。我知道在 python 中,循环、列表推导和 map()
函数之间存在重要的性能差异。是否有针对此类问题(主要是数值计算)的 Rust 性能指南?
for 循环是 Rust 中迭代器的糖:doc.rust-lang.org/stable/std/iter/index.html#rust%27s-for-loop 所以不应该这样:)
map
返回一个 Map,也称为键值对(迭代器)。我想要的只是值,但顺序正确(Map::values()
给出任意顺序。所以例如0..10
给了我一个从 0 到 10 的迭代器。现在我想应用 '|x| x*x`这个迭代器得到一个所有正方形的迭代器,所以 0, 1, 4, 9, ..., 100。
谢谢,但是在地图回调中调用多个函数呢?
这是一个闭包,你可以在body里面放任何你想要的东西。与任何闭包一样,如果您有多个表达式,则需要 。【参考方案2】:
从 Rust 1.21 开始,std::iter::Iterator
特征定义了一个 for_each()
组合子,可用于对集合中的每个元素应用操作。它是渴望的(不是懒惰的),所以不需要collect()
:
fn main()
let mut vec = vec![1, 2, 3, 4, 5];
vec.iter_mut().for_each(|el| *el *= 2);
println!(":?", vec);
上面的代码将[2, 4, 6, 8, 10]
打印到控制台。
Rust playground
【讨论】:
以上是关于Rust 是不是有办法将函数/方法应用于数组或向量中的每个元素?的主要内容,如果未能解决你的问题,请参考以下文章