よく使う型変換の tips です。
Result -> Option
let res: Result<&str, &str> = Ok("hogehoge");
assert_eq!(Some("hogehoge"), res.ok());
Err は None になります。
Option -> Result
let opt = Some("fugafuga");
assert_eq!(Ok("fugafuga"), opt.ok_or("error!"));
let opt: Option<&str> = None;
assert_eq!(Err("error!"), opt.ok_or("error!"));
ok_or の引数には None のときに Err としてとる値を記述する必要があります。
Option, Result を安全に unwrap
let opt = Some("hogehoge");
assert_eq!("hogehoge", opt.unwrap_or("fugafuga"));
let opt = None;
assert_eq!("fugafuga", opt.unwrap_or("fugafuga"));
let res: Result<&str, &str> = Ok("hogehoge");
assert_eq!("hogehoge", res.unwrap_or("fugafuga"));
let res: Result<&str, &str> = Err("error!");
assert_eq!("fugafuga", res.unwrap_or("fugafuga"));
unwrap_or は unwrap 失敗時に使われるデフォルト値を設定して unwrap する関数です。
おわり
or より or_else の方がパフォーマンス的に推奨されますが、or_else は定数の代わりに関数書かないといけないのでちょっと敬遠しがちです。