Rustの疑問符演算子の使い方

try!マクロとほぼ同等の機能を持っている。そこから察して下記の機能がある。

  • Result型を返すスコープ内で使える
    • Errではなければunwrap()と同等の結果を返す
    • Errであるとreturn Err()の挙動をする
  • Fromを実装することでオリジナルエラーから独自エラーへの変換が可能

?を使わない場合

欲するのはErrorだが、処理の中でreturnされるErr()になっているので、map_errを返して手動でErrorに変換している。

#[derive(Debug, PartialEq, Clone)]
enum Error {
    Example
}

fn main() {
    let test = (|| -> Result<(), Error> {
        Err(()).map_err(|_| Error::Example)
    })();

    assert_eq!(Err(Error::Example), test);
}

?を使う場合

Fromを実装することで?を書くだけで、上記と同じ結果を返している。コード量が増えているように見えるが、同等の記述が必要なところが複数現れたときに、すぐに上記の方がコード量が多くなることが想像できる。

#[derive(Debug, PartialEq, Clone)]
enum Error {
    Example
}

impl From<()> for Error {
    fn from(_: ()) -> Self {
        Error::Example
    }
}

fn main() {
    let test = (|| -> Result<(), Error> {
        Err(())?
    })();

    assert_eq!(Err(Error::Example), test);
}

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA