- PVSM.RU - https://www.pvsm.ru -
Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.29.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust с помощью Rustup, то для обновления Rust до версии 1.29.0 вам достаточно выполнить:
$ rustup update stable
Если у вас еще не установлен Rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.29.0 [2] можно ознакомиться на GitHub.
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`
--> srcmain.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 srcmain.rs (1 fix)
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
Если теперь мы откроем srcmain.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.
--> srcmain.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>>>
--> srcmain.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. Работа над этим ведется.
Подробности смотрите в примечаниях к выпуску [2].
В этом выпуске были стабилизированы следующие API:
Arc<T>::downcast [3]Rc<T>::downcast [4]Iterator::flatten [5]Также, теперь вы можете сравнивать &str и OsString [6].
Подробности смотрите в примечаниях к выпуску [2].
Выше мы уже описали две новые подкоманды Cargo. Так же, Cargo теперь будет автоматически пытаться починить Cargo.lock файлы, испорченные git mergeом [7]. Это поведение можно отключить флагом --locked.
cargo doc обзавелся новым флагом: --document-private-items [8]. По умолчанию, cargo doc документирует только публичные части API, потому что предназначен для генерации пользовательской документации. Но если вы работаете над своим пакетом и в нем есть внутренняя документация, то --document-private-items включит генерацию документации вообще для всего.
Подробности смотрите в примечаниях к выпуску [2].
Множество людей участвовало в разработке Rust 1.29. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо! [9]
От переводчика: Благодарю @Revertron [10] за помощь в переводе.
Автор: ozkriff
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/292537
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/install.html
[2] подробными примечаниями к выпуску Rust 1.29.0: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13
[3] Arc<T>::downcast: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast
[4] Rc<T>::downcast: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast
[5] Iterator::flatten: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten
[6] сравнивать &str и OsString: https://github.com/rust-lang/rust/pull/51178/
[7] Cargo теперь будет автоматически пытаться починить Cargo.lock файлы, испорченные git mergeом: https://github.com/rust-lang/cargo/pull/5831/
[8] --document-private-items: https://github.com/rust-lang/cargo/pull/5543
[9] Спасибо!: https://thanks.rust-lang.org/rust/1.29.0
[10] @Revertron: https://github.com/Revertron
[11] Источник: https://habr.com/post/423249/?utm_campaign=423249
Нажмите здесь для печати.