Выпуск 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. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!