Rust 1.29
Команда разработчиков 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` --> srcain.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 srcain.rs (1 fix) Finished dev [unoptimized + debuginfo] target(s) in 0.59s
Если теперь мы откроем srcain.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. --> srcain.rs:5:5 | 5 | std::mem::drop(&lock_guard); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[deny(drop_ref)] on by default note: argument has type &std::result::Result>> --> srcain.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
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` --> srcain.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 srcain.rs (1 fix) Finished dev [unoptimized + debuginfo] target(s) in 0.59s
Если теперь мы откроем srcain.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. --> srcain.rs:5:5 | 5 | std::mem::drop(&lock_guard); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[deny(drop_ref)] on by default note: argument has type &std::result::Result>> --> srcain.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 включит генерацию документации вообще для всего.
>>> Примечания к выпуску
>>> Подробности
Ещё новости по теме:
18:20