24 Июля 2017 • оригинал: The Rust Core Team • перевод: Илья Богданов • новости • поддержите на Patreon

Команда Rust рада представить выпуск Rust 1.19. Rust — это системный язык программирования, нацеленный на скорость, безопасность и параллельное выполнение кода.

Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:

1 $ rustup update stable

Если же Rust ещё не установлен, вы можете установить rustup с соответствующей страницы нашего веб-сайта и ознакомится с подробными примечаниями к выпуску Rust 1.19 на GitHub.

Что вошло в стабильную версию 1.19.0

В Rust 1.19.0 вошли некоторые долгожданные функции, но для начала, замечание для пользователей Windows. На этой ОС Rust использует для сборки link.exe , который входит в состав «Microsoft Visual C++ Build Tools». В последнем выпуске Visual Studio 2017 структура директорий для этих инструментов изменилась. Из-за этого вы были вынуждены использовать инструменты версии 2015 или изменять переменные среды (например, запуская vcvars.bat ). В Rust 1.19.0, rustc знает, как найти инструменты версии 2017, поэтому вам не потребуется более использовать обходные пути.

А теперь к новым возможностям! Rust 1.19.0 — это первый выпуск, поддерживающий union ( Объединения ):

1 2 3 4 union MyUnion { f1 : u32 , f2 : f32 , }

Объединения похожи на enum ( Перечисления ), но они не имеют «меток» в отличие от последних. «Метка» в enum позволяет узнать во время исполнения, какой вариант из перечисленных хранится в переменной.

Так как мы можем неверно интерпретировать данные, хранящиеся в объединении, и Rust не может проверить это за нас, чтение и запись полей объединений небезопасны:

1 2 3 4 5 let u = MyUnion { f1 : 1 }; unsafe { u .f1 = 5 }; let value = unsafe { u .f1 };

Сравнение с образцом (Pattern matching) также работает:

1 2 3 4 5 6 7 8 fn f ( u : MyUnion ) { unsafe { match u { MyUnion { f1 : 10 } => { println! ( "десять" ); } MyUnion { f2 } => { println! ( "{}" , f2 ); } } } }

Когда объединения полезны? Главная сфера применения — взаимодействие с C. C API могут (и часто делают это) предоставлять объединения, так что написание обёрток для API значительно упрощается. Также, из данного RFC:

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

Эту возможность ожидали с давних пор, и есть ещё множество вещей, которые стоит улучшить. На данный момент, объединения могу включать только типы, реализующие Copy , и не могут реализовывать Drop . Мы надеемся убрать эти ограничения в будущем.

К слову, а вы когда-нибудь интересовались, как новые возможности добавляются в Rust? Объединения были предложены Josh Triplett, и он выступил на RustConf 2016, рассказав про процесс интеграции. Вы должны на это взглянуть!

К другим новостям, loop теперь могут возвращать значения через break :

1 2 3 4 5 6 7 8 9 10 // старый код let x ; loop { x = 7 ; break ; } // новый код let x = loop { break 7 ; };

Rust традиционно позиционировал себя как «язык, ориентированный на выражения (expression)», большинство синтаксических конструкций возвращают значения, а не являются операторами (statement). loop несколько выделялся из этого ряда, не возвращая значение.

Что насчёт остальных циклов? Ещё не ясно, смотрите обсуждение в этом RFC.

Небольшое улучшение: замыкания, не захватывающие окружение, теперь могут быть приведены к указателю на функцию:

1 let f : fn ( i32 ) -> i32 = | x | x + 1 ;

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

Компилятор теперь может запускаться на Android. Мы долгое время всячески поддерживали разработку на Android и наша поддержка продолжает улучшаться.

В заключение, о совместимости. Ранее, когда мы двигались к Rust 1.0, мы проделали большую работу, чтобы убедиться в том, что все отмечено как «стабильное» и «не стабильное». Однако мы просмотрели одну вещь: -Z флаги. -Z флаг компилятора включает нестабильные флаги. В отличие от всего остального, вы можете использовать -Z со стабильным Rust. В апреле 2016, в Rust 1.8, мы добавили предупреждение при использовании -Z со стабильной и бета версиями Rust. Более чем год спустя, мы починили эту дыру в нашей истории стабильности, [запретив -Z везде, кроме ночных сборок компилятора] (https://github.com/rust-lang/rust/pull/41751).

Смотрите детальные заметки к выпуску для подробностей.

Стабилизация стандартной библиотеки

Крупнейшие изменения в стандартной библиотеке — макросы eprint! и eprintln! . Они работают точно так же, как print! и println! , но пишут в стандартный вывод ошибок, а не в стандартный вывод.

Другие изменения:

И некоторые стабилизированные API:

Смотрите детальные заметки к выпуску для подробностей.

Улучшения Cargo

В этом выпуске в Cargo были добавлены небольшие, но важные улучшения. Крупнейшее из них: Cargo теперь работает непосредственно с git-объектами. Это уменьшает размер реестра и ускоряет клонирование, особенно на Windows.

Другие улучшения:

Смотрите детальные заметки к выпуску для подробностей.

Разработчики 1.19.0

Множество людей участвовало в разработке Rust 1.19. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!