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)

Кое-что выкинул, в паре мест не осилил перевести термины.

Virtuos86 ★★★★★
() автор топика

Хороший, правильный язык.

SuoiCat
()

Сборочные скрипты теперь могут добавлять переменные окружения к окружению, в котором crate был скомпилирован. Пример: println!(«cargo:rustc-env=FOO=bar»);

Странная фраза. Сборочные скрипты могут добавлять произвольные переменные окружения, которые затем будут переданы в rustc для использования при помощи env!() в исходниках.

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

Ты труъ, поэтому я за тебя сходил и принес оригинал:

Build scripts can now add environment variables to the environment the crate is being compiled in. Example: println!(«cargo:rustc-env=FOO=bar»);

Здесь я перевел по наитию, потому что под конец оформления нервы стали шалить.

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

Ну хз. Просто именно в такой формулировке не сразу понятно что же имеется в виду. Или я просто не выспался...

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

в котором crate был скомпилирован.

У тебя тут прошедшее время

the crate is being compiled in.

А в оригинале тут настоящее время

pftBest ★★★★
()

Rust традиционно позиционируется как «язык ориентированный на выражения», в котором большинство вещей являются выражениями, вычисляющимися в значения, а не директивами.

Звучит разумно. Если бы не примеры с вырвиглазным синтаксисом с 3-х уровневой вложенностью угловых скобочек - уже давно влез бы в rust'ование плотнее. Но поскольку Rust не делает сложные вещи простыми в понимании и обращении, а, как известно, «всё гениальное - просто», то у меня он большого доверия не вызывает: кто ясно мыслит - тот ясно излагает, и здесь у rust'а пробелы пожирнее, чем у того же crystal, использующего ruby-синтаксис.

DRVTiny ★★★★★
()

Воркспейс мемберы теперь могут принимать шаблоны glob файлов.

Даже не знаю с чего начать.

anonymous
()
String теперь реализует FromIterator<Cow<'a, str>> и Extend<Cow<'a, str>>;

Это именно такой синтаксис, при виде которого хочется сказать: «кушайте подобное ...о сами».

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

с 3-х уровневой вложенностью

Не 3, а 5. mod->impl->fn->match->[match_arm] - и уже там кодик

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от DRVTiny

А что неправильного конкретно в этом примере? В других языках нет понятия времени жизни обьекта, так что не получится записать эквивалентный пример на каком нибудь другом языке. Можно только спросить а как бы ты хотел видеть запись такого типа.

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

Синтаксис, пожалуй, единственный минус. Язык ведь реально мощный и быстрый. Но эти brainfuck-овские закорючки - могут оказаться единственной причиной по которой язык может не «взлететь».

anonymous
()

Возвращение значения из цикла это они здорово придумали. Нигде такого не видел, но если подумать — идея отличная.

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

Закорючки, после прочтения половины rust book, обретают смысл и значение. Кроме того, закорючки только в определении функции. А вот в теле функции почти всё выводится атоматом, что делает код на удивление чистеньким. Можно было бы конечно и в определении функции типы выводить - но тогда получится очередной динамический питон или полудинамический хацкель

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

Любая шифровка после прочтения документации, естественно, обретёт смысл и значение.. Но вот насколько это будет удобно и приживётся ли язык на практике, как вы думаете?

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

Хотелось бы словами хотя бы частично. Программа читается намного чаще, чем пишется, и от того, что программист один раз введёт чуть больше буковок - он вряд ли сломается пополам. Зато ему же потом это читать будет легче.

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

Новость вернули в неподтвержденные, поэтому накидывайте косяки.

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

Попробуй расставить запятые в своем комментарии. Он покороче новости, всё ж таки.

Конкретно в этом случае я не в состоянии найти адекватный перевод, потому как всегда воспринимал воркспейс как воркспейс, что тут переводить?

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

Любая шифровка после прочтения документации, естественно, обретёт смысл и значение.. Но вот насколько это будет удобно и приживётся ли язык на практике, как вы думаете?

Единственную реально пугающую шифровку лично я увидел только когда взялся писать рекурсивный макрос. Остальное просто надоедает, да, например, бороться с компилятором, но у него: 1) хорошие сообщения об ошибках; 2) эти ошибки классифицированы и описаны в документации, а также гуглятся весьма успешно.

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

приживётся ли язык на практике

Если оставят эти глупости про то, что весь проект должен собираться статически внутрь одного экзешника, то может и приживется

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

Теперь можно сделать match loop{} {} как замену try{}catch{} блоку.

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

Можно было бы конечно и в определении функции типы выводить - но тогда получится очередной динамический питон или полудинамический хацкель

Очень странный пассаж, учитывая, что в Rust очень много вещей сделано под копирку из Haskell. Ты, наверное, с Haskell совсем не знаком?

dave ★★★★★
()

Может кто пояснить разницу между rust и ponylang? Вроде цели те же, гарантии те же, но в ponylang синтаксис приятней.

MLP_Fan ★★
()

Не перестаю удивляться как им удалось создать ЯП полностью из синтаксического мусора. Так ведь с каждым релизом его добавляют еще больше.

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

Ты, наверное, с Haskell совсем не знаком?

Спалил

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

Если не переводишь что-то, то хоть оставляй на английском. Тем более что workspace.members - это название поля в Cargo. Но вот это меня просто добило:

шаблоны glob файлов

Какие нахрен шаблоны glob файлов? glob - это синтаксис шаблона поиска, например, path/*. Я, конечно, не переводчик, но вот так звучит адекватнее:

Поле workspace.members теперь поддерживает glob шаблоны

Не дословно, но зато передает смысл.

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

Ну а если уж переводить, то надо найти какие русские термины в данном случае следует использовать и использовать их, а не просто транслитерировать английские слова.

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

Да, здорово. В Ruby так же.

Ох лол, в лиспе это уже 50+ лет есть.

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

Хотя в данном случае вообще смесь из транскрипции и транслитерации.

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

Не перестаю удивляться как им удалось создать ЯП полностью из синтаксического мусора. Так ведь с каждым релизом его добавляют еще больше.

Внезапно, но это не мусор. Но вам всё равно не понять т.к. вы жертва Blub paradox.

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

Может кто пояснить разницу между rust и ponylang?

Pony использует garbage collection. Значит нужен нетривиальный рантайм, значит не пойдёт как замена C.

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

Не перестаю удивляться как им удалось создать ЯП полностью из синтаксического мусора.

А я не перестаю удивляться сообщениям, созданным из смыслового мусора.

Назовите синтаксические элементы, не используемые в других языках. Назовите, что за мусор был добавлен в каждом релизе.

Хотя, может быть и не стоило OCaml'овскую одиночную кавычку использовать. Слишком уж она незнакомых с функциональными языками пугает.

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)

это первый выпуск, который поддерживает объединения (unions)

Только сейчас? И нам тут год с лишним втирали, что раст уже готов?

anonymous
()

Хорошее обновление. А я как раз учу раст.

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

Прям так много задач, где эти объединения реально нужны, а не enum. Они нужны только для байтодрочерства в стиле С.

anonymous
()

This

Закопайте вы это поделие уже. Есть же божественная ADA!

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

Слишком уж она незнакомых с функциональными языками пугает

Незнакомых с функциональными языками нужно в вольерах держать, а не подпускать к современным языкам.

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

Они именно для C FFI их и добавили. Они даже unsafe.

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

Незнакомых с функциональными языками нужно в вольерах держать

В одной клетке теми, кто знаком с ФП столь интимно, что и вовсе перестал видеть в них изъяны

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

1) Чем это мешает?

Например, есть прекраснейшая rust утилита, замена The Silver Searcher - ripgrep. Ее экзешник в арче весит 2.6 МБ и включает в себя несколько десятков крейтов. Экзешник The Silver Searcher весит 90 КБ. Мэйнтейнеры будут очень недовольны, если репозиторий заполонят подобные многомегабайтные утилиты, каждая из которых вкомпиливает внутрь себя все свои зависимости

2) Эта фишка опциональна.

Ну видимо что-то помешало мэйнтейнеру ripgrep опакетить ее зависимости по отдельности

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

весит 2.6 МБ

Это после strip? Как-то жирно.

Мэйнтейнеры будут очень недовольны

Спорно. Тянуть 100500 крейтов в системную репу тоже никто не будет.

Ну видимо что-то помешало мэйнтейнеру ripgrep опакетить ее зависимости по отдельности

Делать ему больше нечего. Выбор между «распространять 1 бинарь» vs «распространять 1 бинарь и 100500 либ» очевиден.

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

Делать ему больше нечего. Выбор между «распространять 1 бинарь» vs «распространять 1 бинарь и 100500 либ» очевиден

Чуешь? Чуешь как фраза «rust замена си/си++» утрачивает свою актуальность в глазах линукс-сообщества)

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