- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада представить выпуск Rust 1.19. Rust — это системный язык программирования, нацеленный на скорость, безопасность и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:
$ rustup update stable
Если же Rust еще не установлен, вы можете установить rustup
[1] с соответствующей страницы нашего веб-сайта и ознакомится с подробными примечаниями к выпуску Rust 1.19 [2] на GitHub.
В 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
[3] (Объединения
):
union MyUnion {
f1: u32,
f2: f32,
}
Объединения похожи на enum
(Перечисления
), но они не имеют "меток" в отличие от последних. "Метка" в enum
позволяет узнать во время исполнения, какой вариант из перечисленных хранится в переменной.
Так как мы можем неверно интерпретировать данные, хранящиеся в объединении, и Rust не может проверить это за нас, чтение и запись полей объединений небезопасны:
let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };
Сравнение с образцом (Pattern matching) также работает:
fn f(u: MyUnion) {
unsafe {
match u {
MyUnion { f1: 10 } => { println!("десять"); }
MyUnion { f2 } => { println!("{}", f2); }
}
}
}
Когда объединения полезны? Главная сфера применения — взаимодействие с C. C API могут (и часто делают это) предоставлять объединения, так что написание оберток для API значительно упрощается. Также, из данного RFC [4]:
Встроенная в языке поддержка объединений так же позволит упростить реализацию эффективных с точки зрения использования памяти или кэша структур, основанных на представлении значений, как, например, объединения размером машинного слова, используя младшие биты выровненных указателей.
Эту возможность ожидали с давних пор, и есть еще множество вещей, которые стоит улучшить. На данный момент, объединения могу включать только типы, реализующие Copy
, и не могут реализовывать Drop
. Мы надеемся убрать эти ограничения в будущем.
К слову, а вы когда-нибудь интересовались, как новые возможности добавляются в Rust? Объединения были предложены Josh Triplett, и он выступил на RustConf 2016 [5], рассказав про процесс интеграции. Вы должны на это взглянуть!
К другим новостям, loop
теперь могут возвращать значения через break
[6]:
// старый код
let x;
loop {
x = 7;
break;
}
// новый код
let x = loop { break 7; };
Rust традиционно позиционировал себя как "язык, ориентированный на выражения (expression)", большинство синтаксических конструкций возвращают значения, а не являются операторами (statement). loop
несколько выделялся из этого ряда, не возвращая значение.
Что насчет остальных циклов? Еще не ясно, смотрите обсуждение в этом RFC [7].
Небольшое улучшение: замыкания, не захватывающие окружение, теперь могут быть приведены к указателю на функцию [8]:
let f: fn(i32) -> i32 = |x| x + 1;
Теперь мы предоставляем архивы запакованные xz
[9] и используем их по умолчанию, что позволяет ускорить передачу данных. Сжатие с gzip
все еще доступно, на случай если вы не можете использовать xz
по какой-либо причине.
Компилятор теперь может запускаться на Android [10]. Мы долгое время всячески поддерживали разработку на Android и наша поддержка продолжает улучшаться.
В заключение, о совместимости. Ранее, когда мы двигались к Rust 1.0, мы проделали большую работу, чтобы убедиться в том, что все отмечено как "стабильное" и "не стабильное". Однако мы просмотрели одну вещь: -Z
флаги. -Z
флаг компилятора включает нестабильные флаги. В отличие от всего остального, вы можете использовать -Z
со стабильным Rust. В апреле 2016, в Rust 1.8, мы добавили предупреждение при использовании -Z
со стабильной и бета версиями Rust. Более чем год спустя, мы починили эту дыру в нашей истории стабильности, запретив -Z
везде, кроме ночных сборок компилятора [11].
Смотрите детальные заметки к выпуску [2] для подробностей.
Крупнейшие изменения в стандартной библиотеке — макросы eprint!
и eprintln!
[12]. Они работают точно так же, как print!
и println!
, но пишут в стандартный вывод ошибок, а не в стандартный вывод.
Другие изменения:
String
теперь реализует FromIterator<Cow<'a, str>>
иExtend<Cow<'a, str>>
Vec
теперь реализует From<&mut [T]>
[13]Box<[u8]>
теперь реализует From<Box<str>>
[14]SplitWhitespace
теперь реализует Clone
[15][u8]::reverse
теперь в 5 раз быстрее и [u16]::reverse
теперь в 1.5 раза быстрее [16]И некоторые стабилизированные API:
OsString::shrink_to_fit
[17]cmp::Reverse
[18]Command::envs
[19]thread::ThreadId
[20]Смотрите детальные заметки к выпуску [2] для подробностей.
В этом выпуске в Cargo были добавлены небольшие, но важные улучшения. Крупнейшее из них: Cargo теперь работает непосредственно с git-объектами [21]. Это уменьшает размер реестра и ускоряет клонирование, особенно на Windows.
Другие улучшения:
Скрипты сборки теперь могут добавлять переменные окружения в окружение
компилируемого контейнера (crate).
Например: println!("cargo:rustc-env=FOO=bar");
Добавлен флаг --all
для подкоманды cargo bench
, чтобы запускать тестыДобавлена опция --exclude
для исключения некоторых контейнеров при использовании--all
.Опция --features
теперь принимает несколько значений, разделенных запятой илиСмотрите детальные заметки к выпуску [2] для подробностей.
Множество людей участвовало в разработке Rust 1.19. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо! [23]
От переводчика
Благодарю ozkriff [24] и gordon-f [25] за помощь в переводе
Автор: vitvakatu
Источник [26]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/261132
Ссылки в тексте:
[1] установить rustup
: https://www.rust-lang.org/install.html
[2] подробными примечаниями к выпуску Rust 1.19: https://github.com/rust-lang/rust/blob/rust-1.19.0-relnotes/RELEASES.md#version-1190-2017-07-20
[3] union
: https://github.com/rust-lang/rust/pull/42068
[4] данного RFC: https://github.com/rust-lang/rfcs/blob/master/text/1444-union.md#motivation
[5] выступил на RustConf 2016: https://youtu.be/U8Gl3RTXf88?list=PLE7tQUdRKcybLShxegjn0xyTTDJeYwEkI
[6] loop
теперь могут возвращать значения через break
: https://github.com/rust-lang/rust/pull/42016
[7] этом RFC: https://github.com/rust-lang/rfcs/blob/master/text/1624-loop-break-value.md#extension-to-for-while-while-let
[8] теперь могут быть приведены к указателю на функцию: https://github.com/rust-lang/rust/pull/42162
[9] архивы запакованные xz
: https://github.com/rust-lang/rust-installer/pull/57
[10] запускаться на Android: https://github.com/rust-lang/rust/pull/41370
[11] запретив -Z
везде, кроме ночных сборок компилятора: https://github.com/rust-lang/rust/pull/41751
[12] макросы eprint!
и eprintln!
: https://github.com/rust-lang/rust/pull/41192
[13] Vec
теперь реализует From<&mut [T]>
: https://github.com/rust-lang/rust/pull/41530
[14] Box<[u8]>
теперь реализует From<Box<str>>
: https://github.com/rust-lang/rust/pull/41258
[15] SplitWhitespace
теперь реализует Clone
: https://github.com/rust-lang/rust/pull/41659
[16] [u8]::reverse
теперь в 5 раз быстрее и [u16]::reverse
теперь в 1.5 раза быстрее: https://github.com/rust-lang/rust/pull/41764
[17] OsString::shrink_to_fit
: https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.shrink_to_fit
[18] cmp::Reverse
: https://doc.rust-lang.org/std/cmp/struct.Reverse.html
[19] Command::envs
: https://doc.rust-lang.org/std/process/struct.Command.html#method.envs
[20] thread::ThreadId
: https://doc.rust-lang.org/std/thread/struct.ThreadId.html
[21] Cargo теперь работает непосредственно с git-объектами: https://github.com/rust-lang/cargo/pull/4026
[22] Workspace.members теперь принимает шаблоны поиска.: https://github.com/rust-lang/cargo/pull/3979
[23] Спасибо!: https://thanks.rust-lang.org/rust/1.19.0
[24] ozkriff: https://habrahabr.ru/users/ozkriff/
[25] gordon-f: https://habrahabr.ru/users/gordon-f/
[26] Источник: https://habrahabr.ru/post/334068/
Нажмите здесь для печати.