LINUX.ORG.RU

Rust 1.19

 


3

8

Команда 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!, но пишут в стандартный поток ошибок, а не в стандартный поток вывода.

Другие нововведения:

.

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

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

Cargo

Cargo в основном получил небольшие, но значимые улучшения в данном выпуске. Так, Cargo больше не проверяет локальный рабочий каталог для индекса crates.io. Это должно обеспечить меньший размер файла для реестра и улучшить время клонирования, особенно на машинах Windows.

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

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

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Virtuos86 (всего исправлений: 3)
Ответ на: комментарий от NextGenenration

Неявное приведение типов данных. Кстати, неплохая была штука, и за что его так не взлюбили - понятия не имею. Приведение в данном случае, например, из типа string в дочерний по отношению к нему тип TEmail. TEmail отличается от String наличие дополнительных ограничений (Constraints), которые собственно и дают результат в виде либо гарантированно валидной строки-email'а, либо - сгенерированного исключения времени исполнения.

Я бы сказал, что идея автоматически выполнять муторную и весьма тупую работу по конвертации типов - куда более здравая, нежели доверять назначение типа переменной на основе какой-то забубёной эвристики языка. Например, в Julia разумной конвертации типов очень не хватает, учитывая тот факт, что явная конвертация осуществляется абсолютно неочевидными способами, среди которых мультидиспатч-метод convert - один из самых неэффективных (из 10 случаев не работает в 9-ти).

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

Кстати, неплохая была штука, и за что его так не взлюбили - понятия не имею

За неочевидность. Потому что обобщения очевидны: IDE/язык сами подсказывают это. А тут угадать не получается.

Приведение в данном случае, например, из типа string в дочерний по отношению к нему тип TEmail. TEmail отличается от String наличие дополнительных ограничений (Constraints), которые собственно и дают результат в виде либо гарантированно валидной строки-email'а, либо - сгенерированного исключения времени исполнения.

Это получается что по сути любое присваивание может в определённый момет выкинуть исключение? Компилятор хоть предупреждает о не перехваченых исключениях?

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

Неявное приведение типов данных. Кстати, неплохая была штука, и за что его так не взлюбили - понятия не имею.

Когда начнёте писать что-то сложнее hello world - узнаете. И никуда она не исчезала. В плюсах до сих пор есть.

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

Это получается что по сути любое присваивание может в определённый момет выкинуть исключение? Компилятор хоть предупреждает о не перехваченых исключениях?

Добро пожаловать в прекрасный мир С++.

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