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

У меня вообще нет претензий к вкусовщине, в отличии от. Мне фиолетово как оно выглядит.

Я и на питоне немного пишу, хотя он сильно отличается от C++/Rust.

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

создать идеальную абстракцию для клепания других идеальных абстракций

Вы не поверите.

Язык должен иметь нормальный ПМ, а не тащить всё в std.

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

начиная тем, что работают медленнее, нежели код в ядре языка

В нормальных языках - нет.

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

Откуда компилятору знать, что придёт в рантайме?

А в чём проблема завернуть в код валидации?

Было:

email=arg[0]

В действительности генерируется аналог этого:

email=validate(TEmail, arg[0])

Потому, что не наркоманы.

Что-то мне подсказывает: не наркоманы вообще за рамками типов данных мало что валидируют. Так же как, например, ничего не логируют. Платят сейчас в IT всё меньше и меньше, код надо писать как можно быстрее (некогда думать, суй ...) - не до украшательств уже.

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

А в чём проблема завернуть в код валидации?

Так проверка тогда всё равно будет в рантайме. Смысл от этого преобразования?

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

Это конечно не повод включать мозги. Это повод таскать с КАЖДЫМ пакетом ВСЕ его зависимости. А давай ядро и иксы в хомяк ставить. С каждым хеловорлдом своё ядро и иксы.

Напиши патч. Используй симлинки.

Все мы знаем, что прерванную сборку продолжить просто так не получится. Мир рухнет, если сборка прервётся.

Лучше велосипедить.

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

C99 C11 C++11 C++14 C++17

В итоге они всё таки додумались что использовать ИСКЛЮСИТЕЛЬНО сырые указатели не удобно и создали несколько обвёрток. Потом они вспомнили про синтаксический сахар.

У вас каникулы что-ли?

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

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

Придумай, как теперь заменить тот функционал и переписать кодовую базу, которая была до rust'а.

Тут как раз придумывать ничего не надо.

На винду вон, линкуется через жопу.

Виднопроблемы, с учётом того что сказанно в новости.

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

Портянки в несколько тысяч строк кода

Так пишут говнокодеры.

А код с разделением описательной части и мяса легко редактировать в любом notepad'е

Без IDE множество вещей просто недоступно

Кстати, весьма удобно: в описании класса ты видишь его структуру, а потом ниже уточняешь, что каждый элемент структуры означает. Проще говоря, сначала видишь картину на высоком уровне (объект такой-то, поля такие-то и методы вот такие), потом на уровне пониже - уже само кодовое мясо.

Зато количество движений при модификации кода запросто перекроет выигрыш

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

Что это? Оно T берёт из «x: 0»?

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

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

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

Я властвовую над тобой!!!

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

Там нет ничего такого, для чего мог нужен был бы unsafe.

Удивлю тебя: это не редкость, скорее правило.

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

Именно поэтому программированию до сих пор учат на Паскале. И это правильно.

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

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

Функция возвращает что-то, но не ясно что.

Рекомендую посмотреть на то как пишут СЕЙЧАС. Там и рефлексия, и пересборка кода в рантайме, и автогенерация кода...

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

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

Нет, они решили походить на костылях, но получилось как на твоей аватарке.

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

TDims
TLbl

Это пскаль покусал?

poi is Point(float,label)

with poi
  .x=10.237
  .y=-1.9
  .tooltip='WaterCloset here'
end with
В нормальном языке это делается одной строкой, а не 7.

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

Какой там у нас Rust в 2017-м году умеет не присваивать переменной типа EMail нечто, что прямо по первому же символу не является EMail'ом? Ага, никакой не умеет. Зато мы делаем ракеты...

Используй enum

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

Это повод таскать с КАЖДЫМ пакетом ВСЕ его зависимости

Удачи в сборке программы написанной в арче под дебианом(намёк на разные версии библиотек)

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

Какой там у нас Rust в 2017-м году умеет не присваивать переменной типа EMail нечто, что прямо по первому же символу не является EMail'ом? Ага, никакой не умеет. Зато мы делаем ракеты...

Ну, если это принципиально, то можно наколхозить. Макросы для форматированого вывода проверяют формат строки на этапе компиляции. В принципе можно аналогичное сделать, типа let email = email!("это не адрес"); будет ругаться. Правда кривовато будет: придётся дважды реализовывать валидацию, отдельно для рантайма и отдельно для макроса.

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

И где тут валидация? Или тут особая хитрая магия с перегрузкой присваивания?

Скорее имплицитный конструктор для Email.

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

Скорее имплицитный конструктор для Email.

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

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

но теперь мне просто лень что-то учить :(

судя по комментам на редите очень много людей приходили в раст не с первого, а со второго или третьего раза. Тоесть садились учить, потом кидали на полгода а потом возвращались.

Так что если ты еще не начинал то возможно не зайдет с первого раза.

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

Люди очень часто мыслят далеко не рациональными категориями

И только ты один мыслишь свежо и здраво. Фанатов бейсика я вижу примерно раз в несколько лет. Причем среди профессиональных программистов не вижу вообще.

почему Linux (какой угодно из дистрибутивов), который объективно уделывает Windows по всем параметрам - установлен в лучшем случае на 1% ПК

Потому что он не «уделывает Windows». Там, где уделывает - используется больше.

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

если можно изначально делать язык читабельным - хотя бы из соображений того, что на нём люди будут писать

Тебе уже раз 10 говорили, что нет серьезной проблемы использовать синтаксис, если ты его знаешь. Есть гораздо более весомые причины выбирать тот или иной ЯП и синтаксис далеко не на первом месте. Так это работает. А ты пытаешься выбирать автомобиль по запаху освежителя воздуха в салоне.

Clayman ★★
()

Плесну-ка я маслица в затухающий огонь.

На тему ко-ко-ко, на rust ничего не пишут...
Вот когда разработчики rust колонизуют Марс - тогда и поговорим...

В firefox начали встраивать куски servo. Уже в ночных сборках. Подробности.

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

sleep это тоже выражение а не директива, возвращает пустой тип (аналог void только удобнее). И при чем тут sleep вообще?

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

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

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

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

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

Какой ужас, как мне жить теперь.

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

но получилось как на твоей аватарке.

Это вообще-то танцор. Он на костылях танцует.

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

Кстати

unsafe отличается от safe только этим
Вызывать unsafe функции (включая функции на Си, встроенные функции, сырое распределение)

Вот, например, я пишу код, в котором хочу подружить две либы на си. Получается мне придётся делать всё в unsafe? В таком случае какая разница между си и растом?

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

Если ты используешь код, написанный на небезопасном ЯП, то как Раст может сделать его безопасным? Раст только гарантирует, что вне блоков unsafe ошибок связанных с памятью не будет.

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

Если ты используешь код, написанный на небезопасном ЯП, то как Раст может сделать его безопасным?

Ну, то есть он не нужен, для такой задачи?

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

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

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

Удачи в сборке программы написанной в арче под дебианом(намёк на разные версии библиотек)

Некрофилопроблемы.

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

Напиши патч. Используй симлинки.

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

Лучше велосипедить.

Я уже понял твою позицию — существуют системы сборки пакетов в дистрибутивах. Но мы пошлём их все нафиг и будем таскать с каждым 10 килобайтным хеловорлдом гигабайт зависимостей, ибо фатальный недостаток. И вот это идёт на смену плюсам? Надеюсь недожить до времён, когда старый анекдот про висту станет актуален для онтопика («Сколько места жрёт? Сколько найдёт, столько и жрёт!»), ибо USB 3.1 SSD и не думают дешеветь и появляться в каждом dns-е.

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

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

Ну и алгоритм определения, что строка - email, по первому символу в студию.

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

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

Я уже понял твою позицию — существуют системы сборки пакетов в дистрибутивах.

Новость об ЯП, а срутся из-за его системы сборки. Алё, этот ад открыли первыми еще перловики со своим CPAN, а все остальные подхватили. На этом фоне C и C++ выглядят по-другому только потому, что обосрались сами родить что-то подобное на централизованном уровне, в результате чего имеется причудливый зоопарк разномастных систем сборок, которые вносят разброд в общую массу кодеров, которые славят всяк свой любимый инструмент. Кстати, откуда они взялись, если достаточно apt/dnf/pacman/whatever?

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

Кстати, откуда они взялись, если достаточно apt/dnf/pacman/whatever?

Кодерам на недоосях надоело страдать, но недоось они предать не смогли?

На этом фоне C и C++ выглядят по-другому только потому, что обосрались сами родить что-то подобное на централизованном уровне

А комитет вообще пытался решать эту несуществующую проблему?

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

Кодерам на недоосях надоело страдать, но недоось они предать не смогли?

Аргументы в стиле «недо…» оставь для школоты. Эти «недооси» уступают онтопику только на встраиваемых устройствах, серверах и суперкомпьютерах. А кодеры сидят за обычными писюками, где надрачивают на линух аж 1% от числа всех пользователей. Что же делать остальным-то??

А комитет вообще пытался решать эту несуществующую проблему?

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

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

Что же делать остальным-то??

Переходить на ОС, решающие задачи или страдать. Ну или вдоль.

Не знаю пытался ли, но почему-то пытались другие

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

выдумывая автотулзы и иже с ними

А автотулзы, конечно, фетчат все зависимости в директорию проекта в обход пакетника и собирают весь проект статической линковкой в один большой эльф?

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