Команда Rust рада объявить о последней версии Rust, 1.19.0. Rust это системный язык программирования, сфокусированный на безопасности, скорости и конкурентном выполнении.
Если у вас установлена предыдущая версия Rust, то получите Rust 1.19, выполнив команду:
$ rustup update stable
В противном случае, вы можете получить rustup с соответствующей страницы на нашем вебсайте и проверить детальные примечания к выпуску для 1.19.0 на Github.
Что нового в 1.19.0 stable
Rust 1.19.0 получил некоторые долгожданные возможности, но для начала примечание для наших пользователей Windows. На Windows Rust полагается на link.exe
для линковки, который вы можете получить из “Microsoft Visual C++ Build Tools.” С последним выпуском Visual Studio 2017, структура каталогов для этих инструментов изменилась. Таким образом, чтобы использовать Rust, вы должны придерживаться инструментов 2015 или использовать обходной путь (такой как запуск vcvars.bat
). В 1.19.0 rustc
теперь знает, как найти инструменты 2017, и они работают без использования обходных путей.
А теперь к новым возможностям! Rust 1.19.0 это первый выпуск, который поддерживает объединения (unions):
union MyUnion {
f1: u32,
f2: f32,
}
Объединения это вид перечислений
(enums), но в отличие от последних они «непомечены» («untagged»). Перечисления имеют «пометку», которая хранит информацию, какой вариант является правильным в рантайме; объединения игнорируют эту пометку.
Так как мы можем интерпретировать данные, хранящиеся в объединении, используя неправильный вариант, и Rust не может проверить это для нас, это означает, что чтение или запись поля объединения является unsafe:
let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };
Сопоставление с образцом также работает:
fn f(u: MyUnion) {
unsafe {
match u {
MyUnion { f1: 10 } => { println!("ten"); }
MyUnion { f2 } => { println!("{}", f2); }
}
}
}
Когда полезны объединения? Одним из основных случаев использования является интероперабельность с Си. C API могут использовать объединения, и во многих областях часто это делают, и с появлением объединений в Rust написание оберток для API подобных библиотек становится значительно проще. Дополнительно, из этого же RFC:
Нативный механизм объединений также упрощает Rust реализации компактных или кэш-эффективных структур, опираясь на представление значения как объединений размерности машинного слова, используя младшие значимые биты выровненных указателей, чтобы различать случаи.
Эту возможность уже давно ждали, и еще больше улучшений на подходе. Сейчас объединения
могут только содержать Copy
типы и не могут реализовывать Drop
. Мы ожидаем снятия этих ограничений в будущем.
Также циклы loop теперь имеют возможность возвращать значение при выходе с break
:
// old code
let x;
loop {
x = 7;
break;
}
// new code
let x = loop { break 7; };
Rust традиционно позиционируется как «язык, ориентированный на выражения», в котором большинство вещей являются выражениями, вычисляющимися в значения, а не директивами. Раньше loop
странно выделялся, так как был директивой.
Что насчет других форм циклов? Здесь еще не всё ясно. Посмотрите этот RFC для ознакомления с некоторыми дискуссиями вокруг открытых вопросов.
Замыкания, которые не захватывают окружение, теперь могут быть приведены к указателю на функцию:
let f: fn(i32) -> i32 = |x| x + 1;
Теперь мы создаем тарболы, сжатые xz, и предоставляем их по умолчанию, уменьшая расход сетевого траффика и тем самым ускоряя процесс загрузки. Тарболы, сжатые gzip
, также доступны в случае, например, если вы не можете использовать xz
по некоторым соображениям.
Стабилизация стандартной библиотеки
Наибольшей новой библиотечной возможностью являются макросы 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 больше не проверяет локальный рабочий каталог для индекса crates.io. Это должно обеспечить меньший размер файла для реестра и улучшить время клонирования, особенно на машинах Windows.
Другие улучшения:
- Сборочные скрипты теперь могут добавлять переменные окружения к окружению, в котором crate компилируется. Пример:
println!("cargo:rustc-env=FOO=bar");
- Поле workspace.members теперь поддерживает glob шаблоны.
- Добавлен флаг
--all
к подкомандеcargo bench
для запуска бенчмарков всех членов (members) в заданном рабочем пространстве (workspace). - Добавлена опция
--exclude
для исключения определенных пакетов при использовании опции--all
. - Опция
--features
теперь принимает множество разделенных запятой или пробелами значений. - Добавлена поддержка пользовательских целевых пусковых сценариев (когда target.$triple.runner задан, он будет использован для любой команды Cargo, включая `cargo run', `cargo test' и `cargo bench'; оригинальный файл будет передан пусковому сценарию первым аргументом).
Смотрите детальные примечания к выпуску для получения более подробной информации.
>>> Подробности