Вот пример ошибки с кодом:
fn main() {
let hi = foo;
}
error[E0425]: cannot find value `foo` in this scope
--> src/main.rs:2:14
|
2 | let hi = foo;
| ^^^ not found in this scope
For more information about this error, try `rustc --explain E0425`.
error: could not compile `hei` (bin "hei") due to 1 previous error
Однако эта программа выдаст ошибку без кода:
fn main() {
let 1_i32 << 32;
}
error: expected a pattern, found an expression
--> src/main.rs:2:5
|
2 | let 1_i32 << 32;
| ^^^^^^^^^^^ arbitrary expressions are not allowed in patterns
error: could not compile `hei` (bin "hei") due to 1 previous error
Если мы удалим ключевое слово let
следующим образом, оно вернет другую ошибку из lint:
fn main() {
1_i32 << 32;
}
error: this arithmetic operation will overflow
--> src/main.rs:2:5
|
2 | 1_i32 << 32;
| ^^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
= note: `#[deny(arithmetic_overflow)]` on by default
Это из Rust 1.79.0.
Почему у некоторых ошибок есть код (и объяснение через rustc --explain
), у некоторых — линты, а у некоторых… просто ошибки?
Я прочитал главы книги Rusc, посвященные ошибкам и ворсам. Я ожидал найти ответ, но не нашел ничего полезного.
Это вопрос о дизайне компилятора, поэтому я сверился с Руководство по разработке компилятора Rust и нашел это утверждение о «Коды ошибок и пояснения»:
Большинство ошибок имеют соответствующий код ошибки. Коды ошибок связаны с подробными пояснениями, которые содержат пример того, как вызвать ошибку, и подробные сведения об ошибке. Их можно просмотреть с помощью флага
--explain
или через индекс ошибок.Как правило, ошибке присваивают код (с соответствующим объяснением), если объяснение дает больше информации, чем сама ошибка.
Таким образом, ошибки имеют коды ошибок, когда об ошибке есть что-то, что нельзя разумно поместить непосредственно в сообщение об ошибке.
Вы можете просмотреть индекс ошибок , чтобы увидеть, какие существуют объяснения. Часто они содержат простой пример кода и обсуждение того, почему этот код ошибочен. Вы можете себе представить, что было бы запутанно и многословно, если бы компилятор напечатал этот пример кода вместе с ошибкой в вашем коде!
Нет никакой документации о том, почему бы не использовать код ошибки, но я могу себе представить, что было бы дополнительной работой добавлять код для каждого отдельного случая, когда компилятор выдает ошибку, или решать, действительно ли ошибка одного и того же типа. как существующая ошибка. А это означало бы, что индекс ошибок станет очень большим, тем более что он охватывает не только все ошибки в текущей версии компилятора, но и во всех предыдущих версиях. (Коды ошибок перестают генерироваться, когда ошибки переклассифицируются в другие категории или становятся разрешенными, а не отклоненными из-за новых особенностей языка.)
Чтобы расширить ответ @KevinReid, я знаю, что у ошибок нет кода ошибки, это два случая: синтаксические ошибки и ворсы.
Синтаксические ошибки не имеют кода ошибки, потому что он бесполезен: он не может сказать больше, чем «ваш файл имеет неверный синтаксис Rust» (если мы не даем конкретный код каждой ошибке, что неработоспособно). Это ваш первый фрагмент (error: expected a pattern, found an expression
).
Линты, как и ваш второй фрагмент (error: this arithmetic operation will overflow
), могут содержать больше информации, но она находится в другом месте: https://doc.rust-lang.org/stable/rustc/lints/listing/index.html, сгруппировано по их тяжесть (deny
, warn
или allow
). Их можно узнать по последней строке ошибки note: `#[deny/warn(lint_name)]` on by default
.