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 */)

但是,Iterators 是懒惰的,所以它本身不会做任何事情。您可以在末尾添加 .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 是不是有办法将函数/方法应用于数组或向量中的每个元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rust中修改向量的元素?

Rust 是不是将添加到向量中的单个项目装箱?

Rust语言教程 - 数组与向量

C 下标值不是数组、指针或向量 - 是吗?

扩展作为内存传递的向量的大小

将函数应用于矩阵或数据框的每一行