为什么 Rustlings 不强迫我消费结果?
Why doesn't Rustlings force me to consume a Result?
经过短暂的尝试,当我 运行 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
我看到了 returns 一个 Result
.
所以我最后的问题是 为什么 .read_line
的调用者不必处理它 returns 的错误? 好像这个 Rustlings 的教训几乎是在诱使用户告诉他们你不能依赖 type-safety。查看文档,所有这些似乎都没有记录。 Rust 甚至有一个标题为 "Results must be used",
的部分
Result is annotated with the #[must_use]
attribute, which will cause the compiler to issue a warning when a Result value is ignored. This makes Result especially useful with functions that may encounter errors but don't otherwise return a useful value. [...] If you do write that in Rust, the compiler will give you a warning (by default...
这种行为记录在哪里?还有哪些其他核心功能可以避免错误发生?
Rustlings 不显示编译器警告。
您通常看到的是警告,而不是错误。 Rustlings 不会向最终用户反映编译器警告。所以你什么都看不到。
如果您想查看警告,请添加
#![deny(warnings)]
但是,Rustlings 代码中有很多警告,因此似乎在其他警告升级为错误之一停止编译之前不会升级该警告。此外 rustlings watch
将在遇到错误时停止观看。
经过短暂的尝试,当我 运行 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
我看到了 returns 一个 Result
.
所以我最后的问题是 为什么 .read_line
的调用者不必处理它 returns 的错误? 好像这个 Rustlings 的教训几乎是在诱使用户告诉他们你不能依赖 type-safety。查看文档,所有这些似乎都没有记录。 Rust 甚至有一个标题为 "Results must be used",
Result is annotated with the
#[must_use]
attribute, which will cause the compiler to issue a warning when a Result value is ignored. This makes Result especially useful with functions that may encounter errors but don't otherwise return a useful value. [...] If you do write that in Rust, the compiler will give you a warning (by default...
这种行为记录在哪里?还有哪些其他核心功能可以避免错误发生?
Rustlings 不显示编译器警告。
您通常看到的是警告,而不是错误。 Rustlings 不会向最终用户反映编译器警告。所以你什么都看不到。
如果您想查看警告,请添加
#![deny(warnings)]
但是,Rustlings 代码中有很多警告,因此似乎在其他警告升级为错误之一停止编译之前不会升级该警告。此外 rustlings watch
将在遇到错误时停止观看。