Выпуск Rust 1.19
Команда 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!
, но пишут в стандартный
вывод ошибок, а не в стандартный вывод.
Другие изменения:
String
теперь реализуетFromIterator<Cow<'a, str>>
иExtend<Cow<'a, str>>
Vec
теперь реализуетFrom<&mut [T]>
Box<[u8]>
теперь реализуетFrom<Box<str>>
SplitWhitespace
теперь реализуетClone
И некоторые стабилизированные API:
Смотрите детальные заметки к выпуску для подробностей.
Улучшения Cargo
В этом выпуске в Cargo были добавлены небольшие, но важные улучшения. Крупнейшее из них: Cargo теперь работает непосредственно с git-объектами. Это уменьшает размер реестра и ускоряет клонирование, особенно на Windows.
Другие улучшения:
- Скрипты сборки теперь могут добавлять переменные окружения в окружение
компилируемого контейнера (crate).
Например:
println!("cargo:rustc-env=FOO=bar");
- Workspace.members теперь принимает шаблоны поиска.
- Добавлен флаг
--all
для подкомандыcargo bench
, чтобы запускать тесты производительности для всех контейнеров в рабочей области (workspace). - Добавлена опция
--exclude
для исключения некоторых контейнеров при использовании опции--all
. - Опция
--features
теперь принимает несколько значений, разделённых запятой или пробелом. - Добавлена возможность настройки способа запуска исполняемых файлов при кросс-компиляции
Смотрите детальные заметки к выпуску для подробностей.
Разработчики 1.19.0
Множество людей участвовало в разработке Rust 1.19. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!