エラー伝搬演算子 (? 演算子) は戻り値の型が OptionResult の関数内で使える。

Option による例

Option では SomeNone かで動作が分岐する。


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 による例

Result では OkErr かで動作が分岐する。


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 でのサンプルコード - ? 演算子の適用』を参照。