为什么 Rustlings 不强迫我使用结果?

Eva*_*oll 0 compiler-errors rust rust-result

经过短暂的尝试,当我运行 Rusling 测试时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
Run Code Online (Sandbox Code Playgroud)

第 69 行有

assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
Run Code Online (Sandbox Code Playgroud)

做一些调试我可以看到read_and_validate(&mut b)正在返回,

Err(ParseIntError { kind: Empty })
Run Code Online (Sandbox Code Playgroud)

我第一次尝试解决这个问题是,

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

但是uh-oh!在我看到的代码中寻找这似乎毫无意义,

Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))
Run Code Online (Sandbox Code Playgroud)

所以我现在可以说我不应该写“呃 - 哦!” 任何地方。查看我的错误的原因,他们提供的错误代码(我们应该修复)有

b.read_line(&mut line); # unmodified notice they don't have `?`
Run Code Online (Sandbox Code Playgroud)

我必须做的是将其更改为以下内容,

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

虽然这很容易,但没有意义。抬头.read_line我看到它返回一个Result.

所以我最后的问题是为什么调用者.read_line不必处理它返回的错误?似乎从这个 Rustlings 中得到的教训几乎是在诱骗用户告诉他们你不能依赖类型安全。查看文档,所有这些似乎都没有记录。Rust 甚至有一个标题为“必须使用结果”的部分

Result 使用#[must_use]属性进行注释,这将导致编译器在忽略 Result 值时发出警告。这使得 Result 对于可能遇到错误但不返回有用值的函数特别有用。[...] 如果你用 Rust 编写它,编译器会给你一个警告(默认情况下......

这种行为记录在哪里?还有哪些核心功能允许错误处理?

Eva*_*oll 6

Rustlings 不显示编译器警告。

您通常会看到的是警告,而不是错误。Rustlings 不会向最终用户反映编译器警告。所以你什么也看不见。

如果要查看警告,请添加

#![deny(warnings)]
Run Code Online (Sandbox Code Playgroud)

但是,在 Rustlings 代码中有很多警告,因此在其他警告之一 - 提升到错误停止编译之前,似乎不会提升该警告。也rustlings watch将停止观看它遇到错误的第二个。