Does Rust have a way to apply a function/method to each element in an array or vector?

Does the Rust language have a way to apply a function to each element in an array or vector?

I know in Python there is the map() function which performs this task. In R there is the lapply(), tapply(), and apply() functions that also do this.

Is there an established way to vectorize a function in Rust?

1

2 Answers

Rust has Iterator::map, so you can:

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

However, Iterators 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]
5

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); // outputs [2, 4, 6, 8, 10]
}

Rust playground

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like