【Rust】エラー処理に関するメモ

ちょっと複雑な状況でのエラー処理方法について調査中。

忘れないように自分用メモ。

 

状況1

foo() -> bar() -> hoge() と関数呼び出しをする。引数と戻り値の型は仮に

  • foo(a:i32)->Result<bool, String>
  • bar(b:i32)->Result<String, String>
  • hoge(c:i32)->Result<i32, String>

とする。

hoge() で失敗していたものを foo()で処理するような場合、どう書くのか?

関数呼び出しが深くなる場合は map_or_else を使えそう。

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.map_or_else

他にも、Result の入れ子を flatten して、find_map とか各種便利な関数を使えそうな気配。

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.flatten

 

 

状況2

fn foo(a:i32)->Result<bool, String>;

fn bar(b:bool)->Result<String, String>;

fn hoge(c:string)->Result<i32, String>

fn main(){

    {

        let a = foo(3);

        let b  = bar(a);

        let c  = hoge(b);

     }

     println!("{:?}"  a or b or c};

}

foo() や bar() の時点で処理に失敗していたら、それ以降の処理は飛ばししたいところ。

このとき、Scala ならば for{} yeild() といった構文が使えるが、 Rust だとどうするのか?という疑問。

 and.then() を使えばよいのかも。メソッドチェーンを実現できるみたい。

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.and_then

他にも便利そうな関数がいくつもある。状況に応じて使えるようになりたい。

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.or

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.or_else

https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_or_else

 

こんなん見つけた。

qiita.com

qiita.com

 状況2に対する答えは、疑問符演算子? のようだ。1年前に調べていた(汗

kzono.hatenablog.com

やはり、ちゃんと動くサンプルコードを書けていないので、理解できていないようだ。。。