Rust语言是否有办法将函数应用于数组或向量中的每个元素?
我在Python中知道有map()
函数执行此任务。在R中,lapply()
,tapply()
和apply()
函数也可以执行此操作。
是否有一种既定的方法来对Rust中的函数进行矢量化?
答案 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]
打印到控制台。