エラー伝搬演算子 (?
演算子) は戻り値の型が Option
や Result
の関数内で使える。
Option
による例
Option
では Some
か None
かで動作が分岐する。
fn main() {
let a1 = calc(40, 2);
let a2 = calc(40, -2);
assert_eq!(a1, Some(42));
assert_eq!(a2, None);
}
fn calc(x: i32, y: i32) -> Option<i32> {
Some(get_src(x)? + get_src(y)?)
}
fn get_src(x: i32) -> Option<i32> {
if x > 0 { Some(x) } else { None }
}
Result
による例
fn main() {
let a1 = calc(40, 2);
let a2 = calc(40, -2);
assert_eq!(a1, Ok(42));
assert_eq!(a2, Err(()));
}
fn calc(x: i32, y: i32) -> Result<i32, ()> {
Ok(get_src(x)? + get_src(y)?)
}
fn get_src(x: i32) -> Result<i32, ()> {
if x > 0 { Ok(x) } else { Err(()) }
}
rustdoc の文書化テストのルート階層で使いたい場合、ちょっとしたコツがいる。
詳しくは『rustdoc でのサンプルコード - ?
演算子の適用』を参照。