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)

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

Смотря о каких задачах речь. У домохозяек они одни, у программистов другие, у физиков третьи. Доля linux'а вне домохозяйст достаточно высока.

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

Доля linux'а вне домохозяйст достаточно высока

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

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

Я тут недавно собирал одну программу под венду... Ох и хлебнул я. Началось всё с того, что Qt под венду нет сборки x86_64, а при сборке по их иструкции для mingw код не собрался, насыпав ошибками, что-то пофиксил, но после нескольких попыток — забил. Решил отложить пока Qt и проследовал к следующей либе — fftw, у них на сайте написано, что они под венду собирают кросскомпиляцией с linux при помощи mingw и рекомендуют всем делать так же, но при попытке так сделать, оказалось, что одна из либ (fftw_omp) не собирается с --enable-shared. Гугль показал, что ребята из cygwin патчили файлы сборки у себя, но там другая версия и, наверное, из-за этого их патч мне не помог. Далее на очереди был freeglut, в свежайшей версии предлагалось собирать скопировав кусок make-файла из readme, а для кросскомпиляции был cmake файл, но он валился с ошибками непонятными. Скачал предыдущую версию с configure скриптом и собрал без проблем.

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

%имя_менеджера% install что_мне_надо
и выполнять свои задачи. И как же жаль тех, кто под вендами всё, описанное выше, делает сам.

flyshoot
()

Итак, подводя итоги: единственным более-менее серьезным продуктом на rust является cargo, который является системой сборки, но при этом называется пакетным менеджером. Да. Это все самое существенное, что следует знать о rust'е.

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

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

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

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

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

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

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

Только вызов си функций

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

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

Ein Volk, ein Reich, ein Fuehrer.

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

/пожимая плечами/ Вангую, что автотулзы делают то, что хочет их пользователь. Как и cargo. Ножом, знаешь, можно хлебушек порезать, а можно и человека, сам по себе он всего лишь инструмент с определенной функциональностью.

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

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

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

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

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

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

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

Только если у вас нет объектов и паттер-матчинга.

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

Нечего их жалеть. Пускай переходят на Linux по совету robus.

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

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

Есть как минимум решение в стиле go - папка в хомяке, общая для всех проектов. Либо осилить права(примерно как с пингом) когда благодаря особым флагам даже простой пользователь мог писать туда.

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

И сколько там пакетов? Захочешь воспользоваться чем-то что не стало навязанным стандартом(типа крестов), и этого уже может не оказаться в твоём дистре

Но мы пошлём их все нафиг и будем таскать с каждым 10 килобайтным хеловорлдом гигабайт зависимостей, ибо фатальный недостаток

Это заблуждения фанатика или мракобеса? Не будет там гигабайта зависимостей

USB 3.1 SSD и не думают дешеветь

Если гоняешься за дешёвым местом - посмотри на hhd

«Сколько места жрёт? Сколько найдёт, столько и жрёт!»

Даже виста не заполняла всё доступное место. Но мракобесы не в курсе, мракобесы висту не видели.

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

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

А комитет вообще занимается чем-то кроме очередных костылей и сгнившей изоленты?

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

Итак, подводя итоги: единственным более-менее серьезным продуктом на rust является cargo

Забыл еще rustc и остальные тулзы для разработчиков. Языг джва года, как стабилизировался, в первую очередь бурно строгают языкоспецифичный инструментарий для разработки на нём. А если в какой коммерческой конторе на нем пилят что-то существенное, то надо подождать историй успеха. В самой мозилле едва-едва наработки начали внедрять в огнелиса. Да, видимо, это не Go и на нем нельзя просто взять и начать писать тонны кода.

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

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

И сделать всё самому если меинтер о чём-то не слышал. Хотя если не воевать с ветряными мельницами, то собрать очень просто

Началось всё с того, что Qt под венду нет сборки x86_64, а при сборке по их иструкции для mingw код не собрался

Зато чуть ли не в каждой новости про gui qtфилы начинают втирать про кросплатформенность.

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

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

Нет, T - это обобщённый тип. А вот Point { x: 0, y: 0 } или { x: 10, y: 14 } - это заполнение числами структуры Point. В данном примере либо интами, либо флоатами заполняется данная структура. Можно строки подсунуть, это не важно. На других языках, обычно это выглядит в разы хуже =)

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

Дык вся программа суть вызов то одних функций то других.

У тебя просто не может быть 100% вызова сишных функций в rust. Всё равно кроме вызова функций будет другой код.

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

Да, видимо, это не Go и на нем нельзя просто взять и начать писать тонны кода.

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

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

Зато чуть ли не в каждой новости про gui qtфилы начинают втирать про кросплатформенность.

Дык, может оно кроссплатформенно валится везде, просто в линуксах мэинтейнеры пофиксили баги))

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

просто в линуксах мэинтейнеры пофиксили баги))

Плазма не падает, плазма не падает, плазма не падает, ...

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

В этом примере я бы написал так:

У Вас 183 символа, у меня 85. Правда Вы ещё одно поле добавили, без него 110 символов получается. Лаконичность Rust'a очевидна.

Притом в вашем примере, возможные типы для x,y определены как int, float, double. Возможно ли в Вашем примере использовать любой тип для x,y? И возможно ли в Вашем примере использовать любой тип для x,y - у которого есть, например, медот method_test() ?

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

И ранее приводил аналогичный пример с функциями, тут.

И где здесь вложенность угловых скобок?

А это уже, видимо, я пропустил. Можете скинуть пример?

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

Всё нормально с Qt. Проблема с mingw64. 64-бит сборки есть для MSVS. В любом случае ничего лучше Qt так и не придумали.

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

Есть как минимум решение в стиле go - папка в хомяке, общая для всех проектов. Либо осилить права(примерно как с пингом) когда благодаря особым флагам даже простой пользователь мог писать туда.

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

И сколько там пакетов? Захочешь воспользоваться чем-то что не стало навязанным стандартом(типа крестов), и этого уже может не оказаться в твоём дистре

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

Это заблуждения фанатика или мракобеса? Не будет там гигабайта зависимостей

CUDA — на помойку, как и всё, что от неё зависит. Qt — на помойку, как и всё, что от него зависит. LLVM — ну ты понял куда, как и всё что от него зависит. И это новый основной язык? Замена сишке и плюсам? Ни утечек памяти, ни разыменования невалидных указателей... Ни библиотек или софта.

Если гоняешься за дешёвым местом - посмотри на hhd

Купить HDD, большой, тяжёлый и жрущий батарею. Молиться на него — тряска очень вредна. Ждать по нескольку минут выполнения элементарных операций. И ради чего? Чтобы пользователям ОС-ей, куда не завезли пакетник было чуточку (только чуточку — нормальный шел там только-только замаячил на горизонте) удобнее компилять. Нет уж, спасибо.

Но мракобесы не в курсе, мракобесы висту не видели

Мракобесы не видели. А я видел её. И на 16 GB, которые у меня под корень выделены явно не влезет виста с IDE-шкой, брузаком и прочими мелочами для уюта.

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

мракобесы
тонких материй

Ясно. Очередной теолог.

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

Зато чуть ли не в каждой новости про gui qtфилы начинают втирать про кросплатформенность.

На GNU/Linux есть, на Android есть, на *BSD есть, на эмбедеде всяком — тоже есть. На Шиндовс нет (на самом деле есть, но для студии, а не MinGW).

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

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

И выкачивать гигабайт (ну ладно, не гигабайт — 900 мегабайт) зависимостей в папку с проектом.

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

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

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

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

Да, видимо, это не Go и на нем нельзя просто взять и начать писать тонны кода.

«Это ты самую суть ухватил».(С) Зачем нужен такой сложный инструмент, с такой слабой обратной совместимостью и с таким сообществом? Автор этого недоязычка, мозилла, весьма жидко обделалась на показательном примере servo. Зачем другим рисковать?

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

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

Так добавь сам. Какие проблемы?

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

Это ты жидко обделался. У тебя есть примеры написания полноценного браузерного движка с 0 на не «недоязыках»? Насколько я знаю за последние лет 20 не было ни одного нового. Все существующие - это перепиленное 100 раз и подправленное костылями и подпорками дерьмо мамонта.

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

Ты ошибаешься, отец. Может мыло начинаться с пробела

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

Это ты жидко обделался. У тебя есть примеры написания полноценного браузерного движка с 0 на не «недоязыках»?

И как, в каком дистрибутиве я могу попробывать этот замечательный браузерный движок? Какой roadmap у производителя по внедрению? Если это не фейл, то что ты называешь фейлом?

Насколько я знаю за последние лет 20 не было ни одного нового. Все существующие - это перепиленное 100 раз и подправленное костылями и подпорками дерьмо мамонта.

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

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

Уважаемый DRVTiny Вы снова сливаетесь? У нас же мог получиться очень интересный спор, но почему Вы игнорируете это сообщение и это?

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

примеры написания полноценного браузерного движка с 0 на не «недоязыках»?

KHTML. 2 чувака за год выкатили готовый продукт. Учитесь, хипсторы. Можешь начинать жевать сопли на тему «интернеты были не те», но факт есть факт. Мозилла не просто не выкатила продукт, а самс уже на грани рипца.

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

KHTML. 2 чувака за год выкатили готовый продукт.

Чё та мне кажется 2 чувака не выкатят даже за 10 лет продукт уровня Servo

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

Firefox nightly https://blog.nightly.mozilla.org/2017/07/25/stylo-is-ready-for-community-test...

Упырь свой мел. Я и сейчас сам собираю лису с rust'ом (поддержку mp4-файлов мозилла сделала на нем). Парсить css на расте ради многопоточности - наркоманы одобряют. И да, парсинг css - это далеко не движок.

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

layout.css.servo.enabled

За пару лет написали парсер CSS? Мощно.

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

KHTML. 2 чувака за год выкатили готовый продукт.

Чё та мне кажется 2 чувака не выкатят даже за 10 лет продукт уровня Servo

Аха, они выкатили продукт уровня webkit, тормоз.

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