Does Rust have a way to apply a function/method to each element in an array or vector?
Rust has Iterator::map
, so you can:
some_vec.iter().map(|x| /* do something here */)
However, Iterator
s are lazy so this won't do anything by itself. You can tack a .collect()
onto the end to make a new vector with the new elements, if that's what you want:
let some_vec = vec![1, 2, 3];
let doubled: Vec<_> = some_vec.iter().map(|x| x * 2).collect();
println!("{:?}", doubled);
The standard way to perform side effects is to use a for
loop:
let some_vec = vec![1, 2, 3];
for i in &some_vec {
println!("{}", i);
}
If the side effect should modify the values in place, you can use an iterator of mutable references:
let mut some_vec = vec![1, 2, 3];
for i in &mut some_vec {
*i *= 2;
}
println!("{:?}", some_vec); // [2, 4, 6]
If you really want the functional style, you can use the .for_each()
method:
let mut some_vec = vec![1, 2, 3];
some_vec.iter_mut().for_each(|i| *i *= 2);
println!("{:?}", some_vec); // [2, 4, 6]
Since Rust 1.21, the std::iter::Iterator
trait defines a for_each()
combinator which can be used to apply an operation to each element in the collection. It is eager (not lazy), so collect()
is not needed:
fn main() {
let mut vec = vec![1, 2, 3, 4, 5];
vec.iter_mut().for_each(|el| *el *= 2);
println!("{:?}", vec);
}
The above code prints [2, 4, 6, 8, 10]
to the console.
Rust playground