Написать пост

Вышел Rust 1.29

Аватар Никита Нельсон

Основными нововведениями стали функции fix и clippy для пакетного менеджера Cargo, которые служат для поиска и исправления ошибок в коде программы.

Обложка поста Вышел Rust 1.29

Команда разработчиков языка программирования Rust представила версию 1.29, которая уже доступна для загрузки с помощью инструмента rustup. Основное нововведение обновления — добавление новых возможностей для пакетного менеджера Cargo.

С версией 1.29 Cargo получит несколько новых функций, среди которых есть cargo fix и cargo clippy.

Инструмент cargo fix

Роль функции заключается в автоматическом исправлении некоторых синтаксических ошибок. К примеру, редактор вводит код:

			fn do_something() {}

fn main() {
    for i in 0..100 {
        do_something();
    }
}
		

Переменная i не использовалась в программе до этого, о чём предупреждает компилятор:

			> cargo build
   Compiling myprogram v0.1.0 (file:///path/to/myprogram)
warning: unused variable: `i`
 --> src\main.rs:4:9
  |
4 |     for i in 1..100 {
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.50s
		

Команда cargo fix исправляет ошибку автоматически:

			> cargo fix
    Checking myprogram v0.1.0 (file:///C:/Users/steve/tmp/fix)
      Fixing src\main.rs (1 fix)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s
		

Таким образом, редактор получает исправленный src\main.rs:

			fn do_something() {}

fn main() {
    for _i in 0..100 {
        do_something();
    }
}
		

При использовании переменной _i предупреждение появляться не будет.

Функция cargo fix использует специальный API компилятора. Она взаимодействует только с теми предупреждениями, в уместности которых разработчик уверен. Пока их немного, но со временем список будет пополняться.

Инструмент cargo clippy

Компонент cargo clippy служит статическим анализатором, выполняя большое количество дополнительных проверок кода. Например:

			let mut lock_guard = mutex.lock();

std::mem::drop(&lock_guard)

operation_that_requires_mutex_to_be_unlocked();
		

Код не содержит синтаксических ошибок, но drop используется для ссылки на lock_guarg, а не для самого lock_guard непосредственно. Это может стать причиной взаимной блокировки процессов, так как операция drop для ссылки нерентабельна. Исправление, предложенное компонентом cargo clippy в данной ситуации:

			$ cargo clippy
error: calls to `std::mem::drop` with a reference instead of an owned value. Dropping a reference does nothing.
 --> src\main.rs:5:5
  |
5 |     std::mem::drop(&lock_guard);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[deny(drop_ref)] on by default
note: argument has type &std::result::Result<std::sync::MutexGuard<'_, i32>, std::sync::PoisonError<std::sync::MutexGuard<'_, i32>>>
 --> src\main.rs:5:20
  |
5 |     std::mem::drop(&lock_guard);
  |                    ^^^^^^^^^^^
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.212/index.html#drop_ref
		

Над модулем cargo clippy всё ещё ведется работа. Разработчики намерены выпустить его полную версию только после окончательной отладки и стабилизации. Также эту функцию пока нельзя использовать вместе с cargo fix.

Помимо вышеперечисленного, Cargo затронули следующие нововведения:

  • возможность починить файлы блокировки, испорченные git merge, отключение свойства реализуется через флаг --locked;
  • новый флаг --document-private-items для cargo doc, включающий генерацию всей документации при работе с внутренней документацией пакета пользователя.

Стабилизация работы библиотек

В выпуске 1.29 были стабилизированы следующие API:

  • Arc::downcast;
  • Rc::downcast;
  • Iterator::flatten.

Кроме того, появилась возможность сопоставлять &str и OsString.

Разработчики отметили, что в версии Rust 1.29 довольно мало нового. Они объяснили это тем, что это обновление послужило своеобразной подготовкой к версиям 1.30 и 1.31, которые принесут больше нововведений.

С подробным списком изменений можно ознакомиться в GitHub-репозитории проекта.

Предыдущая версия языка, Rust 1.28, вышла в августе 2018 года. В ней была стабилизирована поддержка кастомных аллокаторов в качестве глобального аллокатора, улучшены сообщения об ошибках при форматировании строк, а также в версию 1.28 были добавлены новые типы, описывающие положительные беззнаковые целые числа различной длины.

Следите за новыми постами
Следите за новыми постами по любимым темам
815 открытий815 показов