# Разбираемся с ошибками в Rust

> Узнайте, как работать с ошибками в Rust, используя компилятор и онлайн-ресурсы. Советы для начинающих и подробная информация о кодах ошибок.

- **URL:** https://eagle2000.space/rust/rust-err/
- **Date:** 2025-05-12

- **Tags:** rust, dev

---Ошибки - неотъемлемая часть жизни любого разработчика. В этой статье мы поговорим о том как получить больше информации о специфических ошибках в Rust.

### Код ошибки и помощь компилятора

Когда компилятор Rust отображает ошибку, он также предоставляет код ошибки. Например может возникнуть такая:

`For more information about this error, try 'rustc --explain E0425'`

Компилятор предлагает использовать команду `rustc --explain` с кодом ошибки для того чтобы увидеть больше информации об этой ошибке.

{{< alert "comment" >}}
`rustc` - это команда запуска Rust компилятора. Вы можете использовать также команду `cargo` вместо неё
{{< /alert >}}

Давайте попробуем запустить эту команду в терминале.
Вывод будет таким:

`An unresolved name was used.`

`Erroneous code examples:`

`something_that_doesnt_exist::foo;`
`// error: unresolved name something_that_doesnt_exist::foo`

`// or:`

`trait Foo {`
    `fn bar() {`
        `Self; // error: unresolved name Self`
    `}`
`}`

`// or:`

`let x = unknown_variable;  // error: unresolved name unknown_variable`

`Please verify that the name wasn't misspelled and ensure that the identifier being`
`referred to is valid for the given situation...`

В результате мы получаем подробную документацию по этой ошибке с примерами и предложениями по исправлению. Удобно, что вся информация доступна в терминале и нам не нужно покидать среду разработки.

Для наглядности давайте посмотрим на интерактивный пример этой ошибки и её исправления:


### 💻 Пример ошибки E0425 (Неразрешенное имя)


#### Шаг 1

```rust
// ?compile_fail
fn main() {
    let message = "Привет, Rust!";
    // Опечатка в имени переменной: messg вместо message
    println!("{}", messg);
}
```

**Ошибка E0425: Использование неизвестного имени**
- Компилятор Rust прерывает сборку, поскольку имя `messg` не объявлено в данной области видимости.
- Обратите внимание на помощь компилятора: он автоматически ищет похожие переменные и предлагает исправить опечатку.


#### Шаг 2

```rust
fn main() {
    let message = "Привет, Rust!";
    // Исправляем опечатку
    println!("{}", message);
}
```

**Исправление опечатки**
- Заменив `messg` на `message`, мы обращаемся к реально существующей и объявленной переменной.
- Теперь компилятор успешно соберёт программу, и в терминале отобразится приветствие.


### Еще один частый гость: Ошибка E0308 (Несоответствие типов)

Другой популярной ошибкой, с которой часто сталкиваются новички, является несоответствие типов (`E0308`). Rust — язык со строгой статической типизацией. Он не выполняет неявные преобразования за вас (например, он не превратит число с плавающей точкой в целое число автоматически).

Давайте посмотрим на интерактивном слайде, как выглядит эта ошибка и как её исправить:


### 💻 Пример ошибки E0308 (Несоответствие типов)


#### Шаг 1

```rust
// ?compile_fail
fn main() {
    // В Rust строгая типизация. Мы не можем присвоить число с плавающей точкой
    // переменной, которая ожидает целое число без явного приведения.
    let speed: i32 = 12.5; 
    println!("Скорость: {}", speed);
}
```

**Ошибка E0308: Несоответствие типов (Mismatched Types)**
- Мы указали тип `i32` (целое число), но присвоили значение `12.5` (с плавающей точкой).
- Rust не выполняет неявных преобразований типов, чтобы уберечь вас от потери данных или точности.


#### Шаг 2

```rust
fn main() {
    // Способ 1: Изменить тип переменной на соответствующий
    let speed_float: f64 = 12.5;
    
    // Способ 2: Явное приведение типов с помощью оператора `as`
    let speed_int: i32 = 12.5 as i32;

    println!("Дробная скорость: {}, Целая скорость: {}", speed_float, speed_int);
}
```

**Решение несоответствия типов**
- Либо меняем тип на `f64` или `f32` для сохранения точности.
- Либо явно приводим значение к `i32` с помощью `as i32` (при этом дробная часть будет отброшена).


### Альтернативные варианты

Хотя поиск ответа через GPT/ИИ может казаться быстрым решением, важно быть осторожным и не полагаться на нейронные сети, которые могут галлюцинировать. Использование `rustc --explain` в сочетании со справочными материалами — гораздо более надёжный и глубокий способ обучения.

### Онлайн-ресурсы

Если вы перейдете по ссылке [Rust Code Errors](https://doc.rust-lang.org/error_codes/error-index.html), то увидите перечень всех кодов возможных ошибок. Кроме того, на сайте вы можете запустить пример кода и увидеть вывод компилятора для конкретной ошибки.

### Советы для начинающих

Чтобы действительно научиться работать с ошибками, не стоит просто исправлять их и двигаться дальше. Вместо этого, на первых порах, следуйте простому алгоритму:

1. Исправьте ошибку.
2. Напишите маленькую программу, которая позволит воспроизвести ту же ошибку компилятора.
3. Подумайте еще раз об этой ошибке и попробуйте объяснить себе, почему она произошла и как принято её решать.
4. Погуглите и поищите помощи на ресурсах и в сообществах, если всё ещё не до конца разобрались.

Следуя этому алгоритму, вы не только исправите ошибку, но и получите более глубокое понимание языка.

### Вывод

Теперь, когда у вас возникнет ошибка компиляции, вы знаете, где можно найти помощь, не покидая среду разработки. Компилятор Rust — ваш надежный и верный помощник. 

В последующих статьях нам ещё не раз предстоит столкнуться с ошибками компилятора, но вы уже вооружены отличным инструментом для их расшифровки и исправления.

---

## Проверь свои знания!

Пройдите короткий интерактивный тест, чтобы закрепить понимание работы с ошибками компилятора в Rust.


### 📝 Разбираемся с ошибками в Rust


**1. Какой командой в терминале можно получить подробную документацию по конкретному коду ошибки?**

- [ ] rustup doc E0425
- [ ] rustc --explain E0425
- [ ] cargo explain E0425
- [ ] rustc --help E0425

**2. Что означает ошибка E0425 в компиляторе Rust?**

- [ ] Несоответствие типов данных (Mismatched Types)
- [ ] Использование необъявленного или неразрешенного имени (переменной, функции и др.)
- [ ] Нарушение правил владения (Use of moved value)
- [ ] Выход за границы массива при доступе по индексу

**3. Как Rust отнесется к попытке неявного приведения дробного числа к целому (например, let x: i32 = 5.5)?**

- [ ] Автоматически округлит значение до 5
- [ ] Автоматически округлит по правилам математики до 6
- [ ] Выдаст ошибку компиляции E0308 (Mismatched Types)
- [ ] Скомпилирует код, но программа упадет с паникой во время работы

**4. Какой первый шаг рекомендуется сделать при возникновении ошибки компиляции перед поиском ответа в интернете?**

- [ ] Переустановить компилятор Rust
- [ ] Внимательно прочитать сообщение об ошибке и использовать rustc --explain
- [ ] Сразу скопировать текст в ChatGPT
- [ ] Заменить все проблемные типы на тип `String`

**5. Где находится официальный онлайн-каталог всех кодов ошибок компилятора Rust?**

- [ ] На сайте doc.rust-lang.org в разделе Error Index
- [ ] В репозитории GitHub в файле README.md
- [ ] На сайте StackOverflow
- [ ] В панели управления Rustup
