When I'm working on something I usually concentrate on the correct path first, so I would liberally add .unwrap()
or _ => panic!()
all over the place. Once I'm satisfied with the implementation, I go back and add tests (and implementations) for error handling. Sometimes, however, it's hard to tell the difference between an .unwrap()
that's essentially a placeholder for error handling and one that's just a runtime check for some program invariant that should always hold. (That's not a problem with catch-alls, because I can use unreachable!()
.)
Is there some smart way to differentiate between the two cases for the purpose of grepping for all the placeholders?
There are usually ways to avoid "legitimate" unwrap, e.g.
if a.is_some() {
a.unwrap()
}
// is
if let Some(a) = a {
}
In more complex cases you may need to get creative with Option/Result helper methods like .map()
, .and_then()
, but I found it's rare where unwrap is unavoidable.
4 Likes