0

短い試行の後、Rustling テストを実行すると、次のexercises/error_handling/errorsn.rsようになります。

---- test_ioerror stdout ----
thread 'test_ioerror' panicked at 'assertion failed: `(left == right)`
  left: `"uh-oh!"`,
 right: `"cannot parse integer from empty string"`', exercises/error_handling/errorsn.rs:69:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

69行目は

assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());

私が見ることができる少しのデバッグを行うと、read_and_validate(&mut b)戻ってきます。

Err(ParseIntError { kind: Empty })

これを改善するための私の最初の試みは、

let num: i64 = line.trim().parse().or(Err("uh-oh!")?;

uh-oh!しかし、これは私が見たコードで探すのが無意味に厄介に思えました。

Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))

ですから、この時点で「うーん!」と書くべきではなかったことがわかりました。どこでも。私のエラーの原因を見ると、彼らが提供するバグのあるコード (私たちが修正することになっている) には

b.read_line(&mut line); # unmodified notice they don't have `?`

私がしなければならなかったのは、それを次のように変更することでした。

b.read_line(&mut line)?; # I added the `?`
let num: i64 = line.trim().parse()?;

それはすべて簡単ですが、意味がありません。見上げる.read_lineと、 が返されますResult

このすべての最後に私の質問は、なぜ呼び出し元が.read_line返されるエラーを処理する必要がないのですか? このRustlingsからの教訓は、タイプセーフに頼ることはできないとユーザーに伝えようとしているようです。ドキュメントを見てください。これはすべて文書化されていないようです。Rustには、「結果を使用する必要がある」というタイトルのセクションさえあります。

Result には属性の注釈が付けられ#[must_use]ます。これにより、コンパイラは Result 値が無視されたときに警告を発行します。これにより、Result は、エラーが発生する可能性があるが、それ以外の場合は有用な値を返さない関数で特に役立ちます。[...] Rustでそれを書くと、コンパイラは警告を出します(デフォルトでは...

この動作はどこに文書化されていますか? エラーを処理できないようにする他のコア関数は何ですか?

4

1 に答える 1

6

Rustlings はコンパイラの警告を表示しません。

通常表示されるのは警告であり、エラーではありません。Rustlings は、コンパイラの警告をエンド ユーザーに反映しません。だからあなたは何も見えません。

警告を表示する場合は、追加します

#![deny(warnings)]

ただし、Rustlings コードには多くの警告があるため、エラーに昇格した他の警告の 1 つがコンパイルを停止する前に、その警告は昇格されないようです。またrustlings watch、エラーが発生した瞬間に監視を停止します。

于 2020-05-06T03:53:35.067 に答える