LINUX.ORG.RU

Rust 1.29

 ,


3

6

Команда разработчиков 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`
 --> 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<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 включит генерацию документации вообще для всего.

>>> Примечания к выпуску

>>> Подробности



Проверено: jollheef ()

Rust 1.30 и 1.31 будут очень значительными

Точного списка пока нет, но насколько я понял, ожидается что:

Вроде бы, мой комментарий с обзорной подборкой ссылок к прошлой новости на хабре зашел хорошо, так что к концу сентября я попробую в примерно том же формате написать хабропост с новостями за месяц и, может, начну делать это регулярно (вдруг кому из лоровцев тоже интересно будет).

ozkriff ()
Последнее исправление: ozkriff (всего исправлений: 2)

Может, хватит уродовть ЛОР?

И опять логотип на пол-страницы. Даже в танго.

Надо либо запретить пихать логотипы в картинки, либо сделать для них отдельный тег.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: Может, хватит уродовть ЛОР? от hobbit

Я бы и рад не на пол страницы (хотел 256x256 лого взять), но лор мне сказал

Технические требования к изображению:
Ширина x Высота: от 400x400 до 5120x5120 пикселей

так что взял следующее лого по размеру - 512x512. Мне не прям принципиально, могу и убрать картинку совсем.

UPD: нет, не могу. Вижу в интерфейсе редактирования только как заменить картинку на что-то другое.

ozkriff ()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от ozkriff

Первое - плагин без поддержки дебагера, второе - платная IDE для сишников. Зачем мне уродовать IntelliJ IDEA малополезным плагином? Я хочу отдельную полноценнцю IDE для Rust.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

М, проглядел требование бесплатности.

Первое - плагин без поддержки дебагера, второе - платная IDE для сишников.

Intellij-rust поддерживает отладку, но только при установке на Clion. Получается вполне себе полноценная IDE для Раста, но платная, да.

Если нужно бесплатное - есть всякие rls-vscode + vscode-lldb, но там RLS, про качество которого последнее время много срачей.

ozkriff ()
Ответ на: комментарий от CYB3R

Когда уже LLD по дефолту запилят?

Не знаю. Какое-то шевеление в эту сторону есть, но пока только для WASM и Cortex-M оно используется:

https://www.reddit.com/r/rust/comments/9a7te2/nightly_rust_is_switching_to_us...

Вроде, вот основная задача про LDD, можно подписаться.

ozkriff ()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от bbk123

Первое - плагин без поддержки дебагера, второе - платная IDE для сишников. Зачем мне уродовать IntelliJ IDEA малополезным плагином? Я хочу отдельную полноценнцю IDE для Rust.

Плагин и дебагер на самом деле вам не нужны потому, что таких слов не существует. IDE есть - это Visual Studio Code с «плагином» (выражаясь по-вашему) для Rust, который интересен тем, что его разрабатывают авторы Rust. Является ли это IDE «полноценным» в вашем понимании - сами и думайте. Меня оно интересует потому, что подходит для разных языков, из которых интересуют Python и Go. Rust мне пока не нужен, но за новостями о нём слежу.

IDE от JetBrains - кому нужен Rust, пусть ознакомится и с ним. Я программными средствами от JetBrains принцпиально не пользуюсь из-за отвращения, которое у меня вызывает эта фирма. Поэтому не имею мнения о том, насколько хороши разные IDE от неё (за исключением её IDE для Java, о котором имею представление). Но вдруг хорошее. Не надо доверять чужим отзывам (включая ваш), а надо ознакомиться с тем, что есть популярного. Ещё узнать, что есть для Rust в Atom и Sublime Text. В общем, узнать, что вообще есть и ознакомиться самостоятельно - что больше понравится.

Примечание.

Можно с уверенностью предположить, что отдельной «полноценной» (не знаю, что вы под этим понимаете) IDE для Rust не будет, учитывая огромный объём труда,который нужен для разработки IDE.

Partisan ()
Ответ на: комментарий от Odalist

Как нету планов? Полу-проприетарное решение от JB пилится и будет пилиться дальше - там грань между расширением и полноценной IDE очень тонка - плюс я выше кидал ссылку на IRLO обсуждение «как нам развивать RLS дальше?», это уже планы полностью открытого языкового сервера и фронтэндов для редакторов.

ozkriff ()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от Partisan

Плагин и дебагер на самом деле вам не нужны потому, что таких слов не существует.

Заведомо ложное утверждение.

IDE есть - это Visual Studio Code с «плагином» (выражаясь по-вашему) для Rust, который интересен тем, что его разрабатывают авторы Rust.

Это не IDE, а лишь текстовый редактор с плагинами.

bbk123 ★★★★★ ()

Теперь в коде используется _i, и предупреждение больше не выдается

Окей, предупреждение не выдаётся. А по сути-то что-то меняется? И почему `_i`, а не просто подчёркивание как везде принято для слива значений?

WitcherGeralt ()
Ответ на: комментарий от WitcherGeralt

Поведение от такого измениться не должно вообще.

И почему `_i`, а не просто подчёркивание как везде принято для слива значений?

Вариант заменить просто на `_` тоже есть, но тогда поведение как раз может измениться для некоторых типов итераторов. `_имя` значит что мы по прежнему создаем привязку и она будет жить на протяжении цикла, просто по соглашению при ее неиспользовании не будет выдаваться предупреждений. А если заменить на `_`, то никакая привязка вообще не будет создаваться (это тогда уже будет просто часть синтаксиса сопоставления с образцом, а не имя переменной) - если у нас какой-то хитрый RAII тип, то это может быть крайне нежелательно.

ozkriff ()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

VSCode пробовал? Я недавно пересел на него с эклипса, доволен всем (С++, JS, Go, всякая скриптота и разметка), кроме интеграции с pylint. Похоже, мне таки придётся осилить Rust, и будет печально, если для него придётся заводить отдельную IDE, тем более идею.

WitcherGeralt ()
Ответ на: комментарий от anonymous

Типичный пример: https://docs.rs/mockito/0.12.0/mockito/#example-1

Да, хороший пример. Только комментарий кривой

Rust treats variables named _ in this special way.

Это не имя переменная вообще, а часть синтаксиса, как я выше писал. Пойду PR им зашвырну.

ozkriff ()
Ответ на: комментарий от Partisan

Мб я не понял как готовить VSCode с питоном, но для референсов между проектами мне пришлось напрямую править .pylintrc, а косяки всё равно остались. Хз какой линтер используется в PyDev, но там всё прекрасно работало, а тут тупняк. Вполне годится, но до идеала питоническому плагину далеко.

WitcherGeralt ()
Ответ на: комментарий от IPFreely

Могу предположить что src\main.rs это системный путь на винде, где разделители как раз обратные слеши. А вот file:// это uri, где разделители прямые слеши, так что все верно.

anonymous ()

cargo clippy - статический анализатор Rust кода

Ну приехали. Статических анализаторов и для C/C++ хватает, где главная фишка раста - контроль на уровне языка?

anonymous ()
Ответ на: комментарий от bbk123

Какую принципиальную разницу ты здесь видишь? IDE отличается от обычного редактора тем, что умеет в дебаггеры, сборку и всякие интеграции. Докидываешь в редактор плагины и он превращается в IDE, а конкретно в VSCode и из коробки много есть.

WitcherGeralt ()
Ответ на: комментарий от anonymous

clippy выдает рекомендации уровня:

Товарищ, вместо `.unwrap_or(Foo::new())` используй `.unwrap_or_else(Foo::new)`. Оба варианта одинаково верные, просто второй на пол шишечки оптимизирован.

anonymous ()
Ответ на: комментарий от IPFreely

На линухе все ок:

Compiling myprogramm v0.1.0 (file:///tmp/myprogramm)                                                   
warning: unused variable: `i`
 --> src/main.rs:2:9
  |
2 |     let i = 42;
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.36s

anonymous ()
Ответ на: комментарий от WitcherGeralt

Какой плагин нужно доустановить, чтобы получить интеграцию с cargo и иметь возможность создать новый проект из VSCode, а не из командной строки? Какой плагин нужно доустановить, чтобы по ctrl+click попасть в реализацию println! или любого другого макро?

bbk123 ★★★★★ ()

Очевидный выбор, конечно же, emacs + [rls (lsp-mode/eglot)], правда качество работы этого самого rls, как и вообще всего протокола lsp оставляет желать лучшего.

anonymous ()
Ответ на: комментарий от anonymous

> cargo clippy - статический анализатор Rust кода
Ну приехали. Статических анализаторов и для C/C++ хватает, где главная фишка раста - контроль на уровне языка?

Совсем все на свете запихнуть в сам язык, к сожалению, пока никто не придумал как. Сама ржавчина дает больше гарантий чем плюсы, в частности гарантирует безопасность работы с памятью при отсутствии unsafe блоков, но от всех возможных ошибок в логике приложения она не в силах спасти. Так что, линтеры все еще полезны для отлова стилистических аномалий и логических косяков.

ozkriff ()