問題タブ [rust-result]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - Rustlings が Result の消費を強制しないのはなぜですか?
短い試行の後、Rustling テストを実行すると、次のexercises/error_handling/errorsn.rs
ようになります。
69行目は
私が見ることができる少しのデバッグを行うと、read_and_validate(&mut b)
戻ってきます。
これを改善するための私の最初の試みは、
uh-oh!
しかし、これは私が見たコードで探すのが無意味に厄介に思えました。
ですから、この時点で「うーん!」と書くべきではなかったことがわかりました。どこでも。私のエラーの原因を見ると、彼らが提供するバグのあるコード (私たちが修正することになっている) には、
私がしなければならなかったのは、それを次のように変更することでした。
それはすべて簡単ですが、意味がありません。見上げる.read_line
と、 が返されますResult
。
このすべての最後に私の質問は、なぜ呼び出し元が.read_line
返されるエラーを処理する必要がないのですか? このRustlingsからの教訓は、タイプセーフに頼ることはできないとユーザーに伝えようとしているようです。ドキュメントを見てください。これはすべて文書化されていないようです。Rustには、「結果を使用する必要がある」というタイトルのセクションさえあります。
Result には属性の注釈が付けられ
#[must_use]
ます。これにより、コンパイラは Result 値が無視されたときに警告を発行します。これにより、Result は、エラーが発生する可能性があるが、それ以外の場合は有用な値を返さない関数で特に役立ちます。[...] Rustでそれを書くと、コンパイラは警告を出します(デフォルトでは...
この動作はどこに文書化されていますか? エラーを処理できないようにする他のコア関数は何ですか?
rust - 結果を返す関数を呼び出すことはできません: opaque 型の impl std::future::Future が見つかりました
から関数の結果を返すことができませんResult
。すべてのチュートリアルでは、結果の使用方法のみを示していますが、結果から値を返す方法は示していません。
次のエラーが表示されます。
rust - Rust の結果の Iter で map を呼び出す
「関数型プログラミング」スタイルでコードを書きたいと思います。
Ok
ただし、結果の反復子から始めて、関数をアイテムに適用したいだけです。さらに、最初のエラーで反復を停止したいと考えています (ただし、別の動作を受け入れることもできます)。
これまでのところ、ネストされたmap()
パターンを使用しています: <iter>.map(|l| l.map(replace))
. これは非常にまずいと思います。
毎晩の「result_flattening」を使用して、ネストさResult<Result<T, E>, E>
れたそれぞれをResult<T, E>
. を使用しeyre::Context
て、さまざまなエラー タイプをエラー タイプに変換しeyre::Report
ます。これはすべて非常に不器用に感じます。
これをRustで書くエレガントな方法は何ですか?
最小限の作業例
さらなる参考文献:
- Iterator::map が Result::Err を返したときに反復を停止してエラーを返すにはどうすればよいですか?
- 結果は を実装し
FromIter
ます。 result_flatten
: https://doc.rust-lang.org/std/result/enum.Result.html?search=#method.flatten、https://github.com/rust-lang/rust/issues/70142 (I' mrustc 1.49.0-nightly を使用 (ffa2e7ae8 2020-10-24))lines()
s を返しますResult
: https://doc.rust-lang.org/std/io/trait.BufRead.html#method.lines