I never really liked the functional programming approach when you want to mutate the iterator, although I also do that, if my function is just one method chain and I'd have to add an extra statement to mutate.
Just ignore this and move on
The problem with the given solution is, that map does not execute by itself. You probably want .map_or((), |i| *i = num), instead, which is executed eagerly.
P.S.: You may have to write |i| { *i = num; }, instead. I'm unsure if *i = num is an expression that returns () or the value of *i.
Option::map is lazy, too. Nvm, you probably talked about my first paragraph. You're right. It's not really mutating the iterator, only a single value, for which a mutable reference is returned.
IMO it's bad style to use a map function, even if it isn't lazy, without using the result because the function is semantically more than you need. So I would do:
if let Some(i) = arr.iter_mut().find(|i| **i == 0) {
*i = num;
}