直観的でないのは ? (try operator) だと思うけど、あれは大昔 try! というマクロがあった時代の話を思い出せば理解しやすいですね
std::try - Rust
https://doc.rust-lang.org/1.44.0/std/macro.try.html
try!(expr)
はだいたい
match expr {
Ok(v) => v,
// ↓ From::from(e) は e.into() とだいたい同じ
Err(e) => return Err(From::from(e)),
}
に展開されるものでした。
その代替・拡張として発生した演算子が ? で、 expr? は Result だけでなく Option とかにも使える。
Option の場合は expr? は
match expr {
Some(v) => v,
None => return None,
}
という感じになる。