ちょっと複雑な状況でのエラー処理方法について調査中。
忘れないように自分用メモ。
状況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
こんなん見つけた。
状況2に対する答えは、疑問符演算子? のようだ。1年前に調べていた(汗
やはり、ちゃんと動くサンプルコードを書けていないので、理解できていないようだ。。。