Команда разработчиков Rust сообщает о выпуске новой версии 1.29. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.Что вошло в стабильную версию 1.29.01.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>> --> 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. Работа над этим ведется.Подробности смотрите [ в примечаниях к выпуску ](
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13 ) .Стабилизация стандартной библиотекиВ этом выпуске были стабилизированы следующие API: [ Arc::downcast ](
https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast ) [ Rc::downcast ](
https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast ) [ Iterator::flatten ](
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten ) Также, теперь вы можете [ сравнивать ](
https://github.com/rust-lang/rust/pull/51178/ ) &str и OsString.Подробности смотрите [ в примечаниях к выпуску ](
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13 ) .Улучшения в CargoВыше мы уже описали две новые подкоманды Cargo. Так же, [ Cargo теперь будет автоматически пытаться починить Cargo.lock файлы, испорченные ](
https://github.com/rust-lang/cargo/pull/5831/ ) git mergeом. Это поведение можно отключить флагом --locked.cargo doc обзавелся новым флагом: [ --document-private-items ](
https://github.com/rust-lang/cargo/pull/5543 ) . По умолчанию, cargo doc документирует только публичные части API, потому что предназначен для генерации пользовательской документации. Но если вы работаете над своим пакетом и в нем есть внутренняя документация, то --document-private-items включит генерацию документации вообще для всего.>>> [ Примечания к выпуску ](
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13 )
Ссылка:
https://www.linux.org.ru/news/mozilla/14472747