Rust是否有办法将函数/方法应用于数组或向量中的每个元素?

时间:2015-09-30 17:12:58

标签: rust

Rust语言是否有办法将函数应用于数组或向量中的每个元素?

我在Python中知道有map()函数执行此任务。在R中,lapply()tapply()apply()函数也可以执行此操作。

是否有一种既定的方法来对Rust中的函数进行矢量化?

2 个答案:

答案 0 :(得分:16)

我们有Iterator::map,您可以:

some_vec.iter().map(|x| /* do something here */)

然而,Iterator是懒惰的,所以这本身不会做任何事情。您可以在最后添加.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]

如果您真的想要功能样式,可以使用itertools crate中的foreach方法。

答案 1 :(得分:5)

自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

相关问题