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

kri*_*nab 16 rust

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

我知道在Python中有map()执行此任务的功能.中的R存在lapply(),tapply()apply()功能也做到这一点.

有没有一种既定的方法来渲染Rust中的函数?

Ste*_*nik 21

我们有Iterator::map,所以你可以:

some_vec.iter().map(|x| /* do something here */)
Run Code Online (Sandbox Code Playgroud)

但是,Iterators很懒,所以这本身就不会做任何事情.你可以.collect()在最后添加一个带有新元素的新向量,如果这是你想要的:

let some_vec = vec![1, 2, 3];
let doubled: Vec<_> = some_vec.iter().map(|x| x * 2).collect();
println!("{:?}", doubled);
Run Code Online (Sandbox Code Playgroud)

在不分配的情况下执行某些操作的标准方法是使用for循环:

let some_vec = vec![1, 2, 3];
for i in &some_vec {
    println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)

或者如果您想要修改值:

let mut some_vec = vec![1, 2, 3];
for i in &mut some_vec {
    *i *= 2;
}
println!("{:?}", some_vec); // [2, 4, 6]
Run Code Online (Sandbox Code Playgroud)

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


U00*_*07D 10

从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);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印[2, 4, 6, 8, 10]到控制台.

铁锈操场