Почему Rustlings не заставляет меня поглотить Результат? - PullRequest
0 голосов
/ 06 мая 2020

После короткой попытки, когда я запускаю тест 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());

Doing небольшая отладка, я вижу, что 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 даже есть раздел под названием «Результаты должны быть использованы» ,

Результат помечен атрибутом #[must_use], который заставит компилятор выдает предупреждение, когда значение Result игнорируется. Это делает Result особенно полезным для функций, которые могут обнаруживать ошибки, но в противном случае не возвращают полезное значение. [...] Если вы напишете это в Rust, компилятор выдаст вам предупреждение (по умолчанию ...

Где задокументировано это поведение? Какие другие основные функции допускают ошибки go unhandeld?

1 Ответ

5 голосов
/ 06 мая 2020

Rustlings не отображает предупреждения компилятора.

Обычно вы видите предупреждения, а не ошибки. Rustlings не отображает предупреждения компилятора для конечного пользователя. Итак, вы ничего не видите.

Если вы хотите видеть предупреждения, добавьте

#![deny(warnings)]

Однако в коде Rustlings есть много предупреждений, поэтому кажется, что это предупреждение не будет быть повышенным до того, как одно из других предупреждений-повышенных-ошибок остановит компиляцию. Также rustlings watch перестанет смотреть, как только обнаружит ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...