Команда разработчиков Rust сообщает о выпуске новой версии 1.29. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Что вошло в стабильную версию 1.29.0
1.29 привносит не очень много изменений. Ожидается что Rust 1.30 и 1.31 будут очень значительными, так что большая часть 1.29 итерации ушла на подготовку к будущим изменениям. Два самых заметных нововведения этого выпуска даже не касаются самого языка: это две новые возможности Cargo и обе они касаются предупреждений.
-
cargo fix
автоматически исправляет предупреждения в коде
-
cargo clippy
- статический анализатор Rust кода, помогающий поймать распространенные ошибки и просто улучшить код
cargo fix
С выпуском Rust 1.29 у Cargo появляется новая подкоманда: cargo fix
. Если вы когда-либо писали на Rust, то скорее всего уже сталкивались с предупреждениями компилятора. Например, рассмотрим такой код:
fn do_something() {}
fn main() {
for i in 0..100 {
do_something();
}
}
В нем мы вызываем do_something
сто раз, но никогда не используем переменную i
. Rust предупреждает нас об этом:
> 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
Видите подсказку о переименовании в _i
? Мы можем автоматически применить ее при помощи 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
исправляет далеко не все предупреждения. Для своей работы cargo fix
использует специальный API компилятора, который предлагает исправлять только те предупреждения, в которых мы абсолютно уверены. Со временем их список будет расширяться.
cargo clippy
Еще о предупреждениях: теперь вы можете попробовать cargo-clippy
через Rustup. Clippy это статический анализатор, который выполняет много дополнительных проверок вашего кода.
Например:
let mut lock_guard = mutex.lock();
std::mem::drop(&lock_guard)
operation_that_requires_mutex_to_be_unlocked();
Синтаксически это правильный код, но мы можем получить дедлок, потому что вызвали drop
для ссылки на lock_guard
, а не самого lock_guard
. Вызов drop
для ссылки имеет мало смысла и почти наверняка является ошибкой.
Установим предварительную версию Clippy через Rustup:
$ rustup component add clippy-preview
и запустим ее:
$ 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
Как видно из примечания к сообщению, вы можете получить полный список всех возможных предупреждений по ссылке.
Обратите внимание, что это только ознакомительная версия; Clippy еще не достиг 1.0, поэтому набор и поведение проверок еще могут меняться. Мы выпустим компонент clippy
, как только он будет стабилизирован, а пока просим вас посмотреть на деле предварительную версию и рассказать нам о своем опыте.
Да, есть еще нюанс: к сожалению, пока что нельзя использовать clippy вместе с cargo-fix
. Работа над этим ведется.
Подробности смотрите в примечаниях к выпуску.
Стабилизация стандартной библиотеки
В этом выпуске были стабилизированы следующие API:
Также, теперь вы можете сравнивать &str
и OsString
.
Подробности смотрите в примечаниях к выпуску.
Улучшения в Cargo
Выше мы уже описали две новые подкоманды Cargo. Так же, Cargo теперь будет автоматически пытаться починить Cargo.lock файлы, испорченные git merge
ом. Это поведение можно отключить флагом --locked
.
cargo doc
обзавелся новым флагом: --document-private-items. По умолчанию, cargo doc
документирует только публичные части API, потому что предназначен для генерации пользовательской документации. Но если вы работаете над своим пакетом и в нем есть внутренняя документация, то --document-private-items
включит генерацию документации вообще для всего.
>>> Примечания к выпуску
>>> Подробности