【问题标题】:Why doesn't Rustlings force me to consume a Result?为什么 Rustlings 不强迫我使用 Result?
【发布时间】:2020-05-06 03:11:49
【问题描述】:

经过短暂的尝试,当我为 exercises/error_handling/errorsn.rs 运行 Rustling 测试时,我得到了

---- 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!"))

所以我现在可以说我不应该在任何地方写“uh-oh!”。查看我的错误的原因,错误代码they provide (which we're supposed to fix) has

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 甚至还有一个名为 "Results must be used" 的部分,

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

这种行为记录在哪里?还有哪些核心功能可以让错误无法处理?

【问题讨论】:

  • ? 您是否明确使用了Result。无论调用read_line 的函数也将返回Result,以便在某个地方进行处理。也许如果您将问题扩展为有关来电者的详细信息,有人可以提供更清晰的答案?
  • 我的问题是为什么当我不使用结果时,它甚至可以编译? .read_line 否则会返回我没有使用的结果。要求b.read_line(&mut line)?; 是有道理的。为什么b.read_line(&mut line); 甚至被允许对我来说是没有意义的。
  • 未使用的Result 不是错误,而是警告。将#![deny(warnings)] 添加到lib.rs 的顶部,原来的变体应该会失败。
  • 啊,我明白了。通常我必须在精神上将这些警告视为错误。当你这样做时,我什至不知道它编译。现在我根本没有收到警告。所以 Rustlings 一定是在吃编译器警告,这使得使用 Rustlings 比使用 Rust 更难。

标签: rust compiler-errors rust-result


【解决方案1】:

Rustlings 不显示编译器警告。

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

如果要查看警告,请添加

#![deny(warnings)]

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

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 2017-10-15
    • 2015-05-11
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2016-08-30
    • 2018-12-21
    相关资源
    最近更新 更多