Выпуск Rust 1.29
Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.29.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust с помощью Rustup, то для обновления Rust до версии 1.29.0 вам достаточно выполнить:
1 | $ rustup update stable
|
Если у вас ещё не установлен Rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.29.0 можно ознакомиться на GitHub.
Что вошло в стабильную версию 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, то скорее всего уже сталкивались с
предупреждениями компилятора. Например, рассмотрим такой код:
1 2 3 4 5 6 7 | fn do_something() {} fn main() { for i in 0..100 { do_something(); } } |
В нем мы вызываем do_something
сто раз, но никогда не используем
переменную i
. Rust предупреждает нас об этом:
1 2 3 4 5 6 7 8 9 10 11 | > 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
:
1 2 3 4 | > 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
, то увидим исправленный код:
1 2 3 4 5 6 7 | fn do_something() {} fn main() { for _i in 0..100 { do_something(); } } |
Теперь в коде используется _i
, и предупреждение больше не выдается.
Первая версия cargo fix
исправляет далеко не все предупреждения.
Для своей работы cargo fix
использует специальный API компилятора,
который предлагает исправлять только те предупреждения,
в которых мы абсолютно уверены.
Со временем их список будет расширяться.
cargo clippy
Ещё о предупреждениях: теперь вы можете попробовать cargo-clippy
через Rustup.
Clippy это статический анализатор,
который выполняет много дополнительных проверок вашего кода.
Например:
1 2 3 4 5 | 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:
1 | $ rustup component add clippy-preview |
и запустим её:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ 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
включит генерацию документации вообще для всего.
Подробности смотрите в примечаниях к выпуску.
Разработчики 1.29.0
Множество людей участвовало в разработке Rust 1.29. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!