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 ()
Последнее исправление: tailgunner (всего исправлений: 3)
Ответ на: комментарий от bbk123

При наличии вменяемого IDE число бросивших Rust было бы меньше.

Новички не будут забрасывать Rust при наличии возможности легко найти работу на Rust. А если вакансий мало, то есть вменяемое IDE или нет его — это погоды не делает.

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

Язык для системного программирования?

Кинь сюда ассемблерный выхлоп примера main из ОП поста.

Идешь сюда, пишешь код, жмакаешь менюшку рядом с кнопкой «Run» («многоточие»), выбираешь ASM, дальше сориентируешься.

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

Уборщицам разрешается на топить.

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

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

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

Ну вот под Go есть отдельный, пусть и не бесплатный, IDE от JetBrains: https://www.jetbrains.com/go/

А для Rust есть лишь какой-то недоплагин и недоредактор. Сравни их функциональности:

https://www.jetbrains.com/go/features/ (Go JetBrains)
https://intellij-rust.github.io/features/ (Rust JetBrains)

А теперь сравни популярность Go с популярностью Rust, включая число вакансий.

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

В принципе - нормально. Хотя результат работы С++ читаем лучше.

В асме я — голимый ноль, иначе бы поинтересовался, а) в чем это выражается, б) является ли это значимым в случае ассемблера, а не какого-либо более человеческого ЯП.

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

С тех пор появились сайты вроде

Спасибо за ссылку. Хорошая вещь. Вот пример:

fn main() {
    let greetings = ["Hello", "Hola", "Bonjour",
                     "こんにちは", "您好"];

    for (num, greeting) in greetings.iter().enumerate() {
        println!("{}", greeting);
        match num {
            0 =>  println!("This code is editable and runnable!"),
            1 =>  println!("¡Este código es editable y ejecutable!"),
            2 =>  println!("Ce code est modifiable et exécutable !"),
            3 =>  println!("このコードは編集して実行出来ます!"),
            4 =>  println!("这段代码是可以编辑并且能够运行的!"),
            _ =>  {},
        }
    }
}

А тут выхлоп Rust Playground:

Compiling playground v0.0.1 (file:///playground)
error[E0428]: the name `main` is defined multiple times
 --> src/main.rs:5:1
  |
1 | fn main() {
  | --------- previous definition of the value `main` here
...
5 | fn main() {
  | ^^^^^^^^^ `main` redefined here
  |
  = note: `main` must be defined only once in the value namespace of this module

error[E0136]: multiple 'main' functions --> src/main.rs:5:1 | 5 | / fn main() { 6 | | let greetings = ["Hello", "Hola", "Bonjour", 7 | | "こんにちは", "您好"]; 8 | | ... | 19 | | } 20 | | } | |_^

error: aborting due to 2 previous errors

Some errors occurred: E0136, E0428. For more information about an error, try `rustc --explain E0136`. error: Could not compile `playground`.

To learn more, run the command again with --verbose.

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

Одалист я думал ты будешь кричать: «Ненужно!» А ты вон как! Тебя что, Тылгуннер обратил в веру растаманскую?

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

a) выражется в понимании кода, который сгенерировал компилятор.

б) если речь идёт о системном программировании, то см. a)

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

Статистику и исследование зависимости удержания новичков от наличия фичи создания проекта в плагине (!) для текстового (!!) редактора (!!!).

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

Ты ещё отпечатки пальцев затребуй в разговоре, где люди обмениваются своими субъективными мнениями. По факту поддержка IDE для Go лучше и популярность Go в реальных проектах и среди предложений работы выше. При этом интересующихся Rust-ом новичков не меньше, если не больше, чем таких же новичков от Go.

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

Выглядит, так, словно твой пример автоматически обернут в функцию `main`. В растовской документации так делают по причинам удобства. Откуда ты его взял?

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

ты делаешь большую работу

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

без таких как ты в новостях про раст было бы по 3,5 комментария, и читать там было бы нечего. в общем, спасибо тебе

MyTrooName ★★★★★
()

На FreeBSD прилетел. Стоит ли?

===>>> The following actions will be taken if you choose to proceed:
	Upgrade rust-1.27.1 to rust-1.29.0

===>>> Proceed? y/n [y]
iZEN ★★★★★
()

Обновил.

% pkg info -x rust
rust-1.29.0
iZEN ★★★★★
()
Ответ на: комментарий от ozkriff

А ты можешь показать что ты конкретно делал?

Ради эксперимента, тупо скопировал код, и вставил в окно Rust playground. Но я уже разобрался. Тупо сделал вот так:

fn main() {
    let greetings = ["Hello", "Hola", "Bonjour",
                     "こんにちは", "您好"];

    for (num, greeting) in greetings.iter().enumerate() {
        println!("{}", greeting);
        match num {
            0 =>  println!("This code is editable and runnable!"),
            1 =>  println!("¡Este código es editable y ejecutable!"),
            2 =>  println!("Ce code est modifiable et exécutable !"),
            3 =>  println!("このコードは編集して実行出来ます!"),
            4 =>  println!("这段代码是可以编辑并且能够运行的!"),
            _ =>  {},
        }
    }
}
Odalist ★★★★★
()
Ответ на: комментарий от anonymous

Одалист я думал ты будешь кричать: «Ненужно!»

Мда, лор никогда уже не будет прежним... Может аккаунт угнали?

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

Массой других факторов, например удобством. Ты врядли прокалываешь колёса своей машины слишком часто, однако это не уменьшает нужность шиномонтажа.

Нет.

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

Да, бадьи нет. Да, возможно, она иногда и пригодилась бы. Но иной раз правильный вопрос не «почему здесь нет бадьи», а «почему бадья была там». Кнопка создания проекта необходима, когда другой альтернативы нет, например если IDE использует собственный формат файла проекта или формат стандартный, но нормального инструмента для инициализации нет. Это логично, нужно упростить создание проекта, и раз всё равно самим реализовывать, почему бы не воткнуть функцию в IDE?

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

К расту это тупо не относится. Есть стандартный инструмент для сборки, он всех устраивает, выбирать особо нечего, поэтому приоритет у фичи «новый проект» околонулевой.

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

Не дочитал твою простыню и честно говоря уже устал спорить. Вот здесь VSCode назван редактором, а IntelliJ IDEA - IDE. Возможность создать проект - одна из функциональностей, отличающих IDE от редактора. Поэтому VSCode таки просто редактор и предлагать его в качестве IDE - элементарно глупо. Кто не согласен, напишите гневный email авторам сайта.

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

Не дочитал твою простыню

Да-да-да, 3 абзаца - непосильный труд. Хорошо, сокращу: функция создания проекта присутствует в IDE в основном из-за отстойности формата makefile, из-за чего все вынуждены были велосипедить.

Я не знаю, сколько камней нужно чтоб получилась куча, но что могу сказать точно: если кто-то добавит в vscode меню «новый проект», который, скажем, предложит выбрать приложение или библиотека и ещё что-нибудь, а потом запустит cargo с соответствующими параметрами, то это никак не изменит то, является ли vscode IDE или нет.

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

раст взлетел

Твой смищной рисунок не про Раст, а как раз про C++.

Я вот только одного не понимаю. Раст это альтернатива «Си плюс плюсу» или же замена «Си плюс плюса»? Раст - это пристанище недовольных «Си плюс плюсом» программистов?

Думаю Раст не вытеснит чистый Си из сегмента микроконтроллеров и ядрописания. Разве складной нож может заменить лезвие бритвы?

К тому же, у Раста пермиссивная лицензия, а бекенд Раста пишут люди которые кормятся из рук проприетарщиков. LLVM пилят не для того чтобы дать людям хороший компилятор, а для того чтобы вытеснить GCC. Хотя они и делают вид что пилят хороший компилятор с отличным изолированием, но скрытой целью у них является вытеснение GCC. Сами подумайте, в нулевых чистая Сишка никому не была нужна, все считали её устаревшей и был единственный компилятор - GCC, который поддерживал все современные стандарты. И тут нате, выкатили проект LLVM?! Кстати, бздуны были рады появлению LLVM, их ведь сильно тяготила лицензия GNU GPL, которая имелась у компилятора GCC.

Когда они писали LLVM они сначала тупо копировали код GCC, а потом уж они его переписывали.

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

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

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

функция создания проекта присутствует в IDE в основном из-за отстойности формата makefile, из-за чего все вынуждены были велосипедить.

Почему ты решил, что все используют Makefile? В Java проектах его нет.

Я не знаю, сколько камней нужно чтоб получилась куча, но что могу сказать точно: если кто-то добавит в vscode меню «новый проект», который, скажем, предложит выбрать приложение или библиотека и ещё что-нибудь, а потом запустит cargo с соответствующими параметрами, то это никак не изменит то, является ли vscode IDE или нет.

Официально VSCode лишь редактор. Спорить с этим просто глупо. Вот и здесь он находится в списке редакторов, а не IDE: https://areweideyet.com/ Но тебе ведь лишь бы поспорить, правда?

bbk123 ★★★★★
()

Лор, ну зачем так подробно обсуждать заведомо унылый вопрос редакторов-против-ide, когда есть столько более интересных стартовых точек для срачей, из которых кто-то даже что-то полезное возможно вынести сможет? Вот держите несколько для примера:

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

Кто все эти люди?

Блоу - довольно известный игровой программист из первой большой волны индюков, автор Braid и The Witness. В контексте Ржавчины интересен тем что пилит свой идеальный язык для убийства плюсов в игрострое - Jai - и пока все показывает его только в стримах. Обещает «как все будет готово» заопенсорсить сразу компилятор со всеми потрохами и готовый игровой движок.

ECS - Entity–component–system - потихоньку набирающий (или уже набравший?) популярность в игрострое шаблон проектирования, когда. Вот какой-то случайный ликбез из гугла.

miniserde - как написано по ссылке, очень-очень облегченная версия автоматической (де)сериализации ржавых структур https://serde.rs, которая поддерживает только JSON.

ripgrep - очень быстрая грепалка по файлам, альтернатива всяким silver searcher'ам и ack'ам.

Сквотеры - ну https://ru.wikipedia.org/wiki/Киберсквоттинг применительно к https://crates.io/ (https://0x0.st/syhE.png)

Никого не забыл? )

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

Почему ты решил, что все используют Makefile? В Java проектах его нет.

Сам выдумал, сам и опроверг. Ещё раз: функция создания проекта присутствует там, где велосипедят свой формат файла проекта. Например в сях с их мейкфайлами. В JAVA мейка нет, но ничего нормального взамен тоже нет, поэтому точно так же велосипедят. В Расте есть нормальная карга, соответственно создание проекта нафиг никому не сдалось.

Официально VSCode лишь редактор. Спорить с этим просто глупо. Вот и здесь он находится в списке редакторов, а не IDE: https://areweideyet.com/ Но тебе ведь лишь бы поспорить, правда?

Я ничего не говорил о том, является ли vscode IDE или нет. На мой вкус, IDE - это когда типичный цикл редактирование-компиляция-отладка происходит внутри одного окна, так что vscode, после установки пары плагинов, вполне себе настоящая IDE. Но спорить об этом я не собирался, это настолько же бессмысленный спор, как о том, сколько камней составляют кучу. Я ответил на конкретное утверждение о необходимости функции «новый проект».

Но от себя добавлю, что во-первых, нонейм сайт - это не официальный источник правды и, во-вторых, даже если бы сайт мыужеиде.ком был бы «официальным», то ссылка на него как на источник утверждения «вс код - это не иде» только на основании того, в каком списке вс код перечислен - это слишком смело. Если бы на тебя ссылались как на автора некоторого утверждения только на основании того, что ты что-то мимоходом упомянул, ты был бы недоволен.

khrundel ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.