La première raison d'utiliser ok_or_else
o tous de la ..._or_else
est d'éviter d'exécuter une fonction lorsqu'elle n'est pas nécessaire. Dans le cas des Option::ok_or_else
o Option::unwrap_or_else
Il n'est donc pas nécessaire d'exécuter un code supplémentaire lorsque l'on utilise la fonction Option
est Some
. Cela peut rendre le code plus rapide, en fonction de ce qui se passe dans le cas d'erreur
Dans cet exemple, Error::new
effectue probablement une allocation, mais il pourrait aussi écrire dans la sortie standard, faire une requête réseau, ou tout ce que n'importe quel morceau de code Rust peut faire ; c'est difficile à dire de l'extérieur. Il est généralement plus sûr de placer ce type de code dans une fermeture afin de ne pas avoir à s'inquiéter des effets secondaires lorsque le cas de réussite se produit.
Clippy le fait également pour vous :
warning: use of `unwrap_or` followed by a function call
--> src/main.rs:3:15
|
3 | let foo = foo.unwrap_or("hello".to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `foo.unwrap_or_else(|| "hello".to_string())`
|
= note: #[warn(or_fun_call)] on by default
= help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#or_fun_call