I am thinking about the case where I have an Option, and I only need to do something in the Some(thing) case. I have used "if let Some(x) = optionvalue {...}; I was reading something else, and realized I could use optionvalue.map({|x| ...}). Is there a reason to prefer one or there other?
Thank you,
Joel
Use map() if you need an output Option produced, and if let if you don't.
Reasons:
- You can use control flow like
break,return,?, orawaitinside of anif letjust like anif; you can’t do the same things withmap()since the closure is a different function. map()is extra work for the compiler, without any benefit in this case, since it has to process a closure construction and a generic function call;if letis simple nearly-primitive control flow.- It's not idiomatic to use
map()when its result is ignored.
Thanks. That is an understandable balance. I will have to look at my various uses.
Do check out the various methods available, though: for example inspect is a closer match to your intention, and is often handy when you're "chaining" methods already.
Sometimes there's methods that are pretty ugly to implement yourself (without unsafe) like take_if where the borrow checker isn't (yet!) smart enough to see what you're doing with matching.
You can also use let Some(...) else if you e.g. want to early return in the None case:
fn selection_sort<T>(lst: &mut [T])
where
T: Ord,
{
let Some(max_idx) = lst.len().checked_sub(1) else {
return;
};
for i in 0..max_idx {
let mut min = i;
for j in (i + 1)..=max_idx {
if lst[j] < lst[min] {
min = j;
}
}
lst.swap(min, i);
}
}