Команда разработчиков языка программирования 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 были добавлены новые типы, описывающие положительные беззнаковые целые числа различной длины.