私はこのようなものを書きたいのですが、タイプ間の不一致のためにコンパイルされません:
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
、常に?
演算子を使用する必要がありますか?
?
そうでない場合、結果コンビネーターをオペレーターと同じくらいスムーズにする方法はありますか?