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)

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

И вы являетесь светочем этой науки? У вас есть степень в этой науке? Вы можете как-то аргуметировать свои вбросы, кроме как «мне так нравится»?

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

он все время что-то ломает

Пруф или не было.

имеет дичайшую заточку под свой пакетный менеджер

Вы любитель собирать все зависимости ручками? Нам с вами не по дороге.

По этому писать на нем нет смысла.

Я правильно понял, что на Rust нет смысла писать потому, что лично вы не осилили собрать какую-то либу под свой ненужно-дистр?

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

Нет. Это по-человечески.

Ну покажите, как это будет по человечески

struct Point<T> {
    x: T,
    y: T,
}

let int_origin = Point { x: 0, y: 0 };
let float_origin = Point { x: 0.0, y: 0.0 };
AntonyRF ★★★★
()
Ответ на: комментарий от RazrFalcon


Я правильно понял, что на Rust нет смысла писать потому, что лично вы не осилили собрать какую-то либу под свой ненужно-дистр?

Нет. Это было объяснение почему на нем ну будут переписывать системные библиотеки.

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

Вы ещё и будущее умеете предсказывать?

Без проблем. Если видишь что лежит яблоко - тыквой оно не станет 100%.

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

А теперь найдите там такой пример, чтобы прога перестала собираться и/или выдавать неверный результат.

Там половина пунктов: было предупреждение, а теперь ошибка.

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

Но у джавы нету тонны других проблем сишки.

Зато есть торомза. Хотя в некоторых моментах их может наоборот не хватать.

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

Вы сами себя читали?

А теперь найдите там такой пример, чтобы прога перестала собираться и/или выдавать неверный результат.

Там половина пунктов: было предупреждение, а теперь ошибка.

Или у вас какая болезнь психическая.

А вообще. Эти пункты есть. И этого достаточно. Вот когда она перестанут появляться - тогда с ним можно будет работать.

anonymous
()

Предлагаю эргономистов натравить на математиков. Мол сигмы не те, да и интегралы тоже непонятно какие. Про шрифт символов для обозначения сигма-алгебр, вообще, молчу. ШГ полное. Ну, а кто, вообще, такой символ градиента придумал? И все в этом роде

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

Зачем его читать? Смотри в прошлое, люди постоянно повторяют свои ошибки.

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

В C++ тоже в новых стандартах ломают совместимость и ничего.

Ну и новые версии GCC/Clang/MSVC тоже косячат. Что, теперь даже сишкой не пользоваться?

RazrFalcon ★★★★★
()

Я бы выучил Rust, еслиб за него не топили дядьки с анимешными аватарками

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

Неужели я единственный в треде, кто не умеет читать будущее?

Если глядя на яблоко ты не можешь сказать, что оно не станет тыквой, то скорее всего такой ты один.

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

Ну на таких простых примерах и я могу. А вот с загадыванием на годы вперёд - не получается.

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

В C++ тоже в новых стандартах ломают совместимость и ничего.

Ну и новые версии GCC/Clang/MSVC тоже косячат. Что, теперь даже сишкой не пользоваться?

Про опцию std слышал?

anonymous
()
Ответ на: комментарий от crutch_master

На уровне: бабка рассказала. Вы в начале темы заливали, что в rust есть GC, а теперь будете петь про деревья?

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

Rust тоже можно не обновлять, тогда и регрессий не будет. Красота.

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

То есть бенчмарки не годятся? Нужно сравнивать абстрактные реализации?

Нужно сравнивать реализации. Сферическими бенчмарками задачи никто не решает.

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

Реализации чего? Реализации вебдвижка сойдут?

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