1

私はこのようなものを書きたいのですが、タイプ間の不一致のためにコンパイルされません:

fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
    let val = std::env::args()
        .nth(1)
        .ok_or("1 arg is expected")
        .and_then(std::fs::File::open)
        .and_then(serde_yaml::from_reader)?;
}

すべてのクロージャーに a を追加するのmap_errは遅く、「ボイラープラティ」に見えるので、次のようなものに置き換えます。

fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
    let val = serde_yaml::from_reader(std::fs::File::open(
        std::env::args().nth(1).ok_or("1 arg is expected")?,
    )?)?;
}

最初のものはより自然で英語のように読めますが、2番目のものは逆のように感じます.

を捨ててand_then、常に?演算子を使用する必要がありますか?

?そうでない場合、結果コンビネーターをオペレーターと同じくらいスムーズにする方法はありますか?

4

2 に答える 2