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)

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

Ехал бы ты отсюда на своем гироскутере

Стало мерзко и гадливо на душе. Как из душа холодной водой окатило.

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

Твой уходящий от темы в несмешные шутки ответ не похож на «да».

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

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

Показано 5 сообщений из 48

У меня так стабильно в толксах.

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

может выяснится что нужен ещё и sdl-ttf(к примеру)

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

Ты не можешь зайти в папку с проектом и сказать apt install-from-file-and-build-project - у тебя просто нет такой функции.

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

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

Сочувствую. Такое ощущение, что были только мои сообщения))

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

Что переделывать? Библиотеки уже есть.

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

Уже сделаны.

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

Раз в 40 лет можно и переписать несколько библиотек

Ладно, всё ясно, ты придуриваешься.

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

Там есть ооп, но при этом весьма странный подход - в классе объявляется только сигнатура метода, тело объявляется уже под классом вне его тела.

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

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

Ты под давлением своего ЧСВ на нижний этаж не проваливаешься?

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

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

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

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

Ну, я стараюсь как могу.

Зачёт =) Так же можно посратся над безопасностью раста, почитать документацию, естественно не полностью, чтобы можно было её обосрать, а затем сказать что говно ваш руст, в унсафе падает =)

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

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

Аналогичный вопрос: почему Linux (какой угодно из дистрибутивов), который объективно уделывает Windows по всем параметрам - установлен в лучшем случае на 1% ПК по всему миру? Да потому что человеческий фактор, предубуждения, репутация, смутное представление о каких-то гипотетических проблемах (примерно такое же смутное и не имеющее отношения к действительности, как и представление о якобы «медленном» BASIC'е).

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

Он не взлетит, если его использовать не будут. А пока это самый любимый язык программирования в 2017-м по версии StackOverflow

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

Берем те же самые ардуины, на каком языке ты сможешь хоть что-то под них написать? с, с++, может еще ada, вот и все, никакого разнообразия. А скоро еще будет раст. Разве это плохо?

Ну, не плохо для ардуин, наверное. Принципиально это что меняет?

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

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

let Foo { a } = foo;
вместо
let Foo { a: a } = foo;

Кто-то знает как засуппресить ворнинг от этого?

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

Это тот, который с heartbleed?

Его починили уже.

Что мешает реализовать эти либы на Rust (что уже и так делают), не считая синдрома утёнка?

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

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

Внезапно да? Это прогресс, детка. Всега будет что улучшить. Что в этом плохого то?

Это не прогресс, а топтание на месте.

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

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

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

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

Твое участие в этом треде - это топтание на месте. Читни уже доку по языку и перестань генерировать мусор.

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

Покажи пример синтаксиса функции Rust для дженериков и я тебе покажу, как можно было сделать то же самое по-человечески.

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

Такой хороший язык - и не взлетел. Бида-бида.

почему Linux, который объективно уделывает Windows

Ага, сравниваем синтаксис ЯП, у которых ЦА - 2.5 дровосека, и ОС, которые пишут многомиллиардные корпорации для миллиардов пользователей, зарабатывая на них тонны зелени.

Линукс не взлетел потому же, почему и мак - MS монополист.

Логика/0.

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

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

На Линуксе я забыл, что такое гибернация. На любом дистрибутиве она у меня не работала искаропки, на винде работала. Так что не по всем.

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

Недействительный итератор - Такое может произойти, когда вы пытаетесь изменить коллекцию, которую в данный момент обходите.
Использование после освобождения (use after free) - Ссылки не должны жить дольше, чем ресурс, на который они ссылаются. Rust проверяет области видимости ваших ссылок, чтобы удостовериться, что это правда.
На ресурс может существовать только одна изменяемая ссылка - таким образом пока Ваш код работает с ресурсом, другой код не может изменить его.

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

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

Твое участие в этом треде - это топтание на месте.

Срач идёт? Идёт. Тред растёт? Растёт.

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

Его починили уже.

И? А сколько не починили? А что, если бы оно было написано на языке, на котором чинить и не пришлось бы? Круто, да?

Вот только сегодня новость была: https://www.opennet.ru/opennews/art.shtml?num=46914

Может хоть увидим, как оно на деле.

В FF уже можете посмотреть.

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

В C++ в шаблонах тоже угловые скобки. Потому что другие все заняты, а парсить проще именно парные закорючки. Лучше придерись к апострофу лайфтаймов.

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

А что, если бы оно было написано на языке, на котором чинить и не пришлось бы? Круто, да?

Слишком громкое заявление. DDoS логические ошибки и пр. никуда не денутся.

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

логические ошибки

А при чём тут логические ошибки, если мы ещё утечки и выход за пределы буфера не осилили.

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

У них есть большое желание снизить порог вхождения. Увы и ах.

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

Не удобно и уродливо.

Вкусовщина в чистом виде. Создайте багрепорт, и напишите им, что вот вам это уродливо. Ссылку суда потом запостите. Поржом.

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

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

Тут смысл такой, что количество элементов менять нельзя в цикле, типа этот код не прокатит:

let mut v = vec![1, 2, 3];

for i in &v {
    println!("{}", i);
    v.push(34);
}

А сами элементы менять можно, если это явно указать через mut. Этот прокатит

    let mut v = vec![1, 2, 3];

    for i in &mut v {
        *i = 32;
        println!("{}", i);
    }

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

Нет. Это по-человечески. Есть целый раздел науки, называется «эргономика». Он не о том, что мне нравится, он о том, что есть такое «по-человечески».

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

А при чём тут логические ошибки, если мы ещё утечки и выход за пределы буфера не осилили.

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

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

Появился раст. Но пока он все время что-то ломает и имеет дичайшую заточку под свой пакетный менеджер (Задолбаешься все сам опакечивать в дистрибутив). По этому писать на нем нет смысла.

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