LINUX.ORG.RU

Вышел Rust 1.20

 


2

7

Команда разработчиков Rust с удовольствием объявляет о выходе новой стабильной версии Rust: 1.20.0.

Rust — это язык программирования, ориентированный на безопасность, скорость и параллелизм.

Если у вас установлена предыдущая версия Rust, то для обновления до Rust 1.20 достаточно выполнить следующую команду:

rustup update stable

(Прим. пер. - иногда предварительно нужно выполнить rustup self update)

Если Rust ещё не установлен, то вы можете установить его скачав rustup с соответствующей страницы на нашем сайте. Также вы можете посмотреть полный список изменений в Rust 1.20.0 на GitHub.

Что нового в стабильной версии Rust 1.20.0

В предыдущих версиях Rust вы уже могли определять «ассоциированные функции» для трейтов, структур и типов-сумм:

struct Struct;

impl Struct {
    fn foo() {
        println!("foo - это ассоциированная функция структуры Struct");
    }
}

fn main() {
    Struct::foo();
}

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

В Rust 1.20 добавлена возможность использовать «ассоциированные константы»:

struct Struct;

impl Struct {
    const ID: u32 = 0;
}

fn main() {
    println!("ID структуры Struct: {}", Struct::ID);
}
Здесь константа ID ассоциирована со структурой Struct. Как и функции, ассоциированные константы могут быть определены для трейтов и типов-сумм.

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

trait Trait {
    const ID: u32;
}

struct Struct;

impl Trait for Struct {
    const ID: u32 = 5;
}

fn main() {
    println!("{}", Struct::ID);
}
В предыдущих релизах Rust при реализации трейта, представляющего числа с плавающей точкой, приходилось писать такой код:
trait Float {
    fn nan() -> Self;
    fn infinity() -> Self;
    ...
}
Это немного неудобно, но, что более важно, такие функции невозможно использовать для определения констант. Из-за этого приходилось вводить дополнительные константы:
mod f32 {
    const NAN: f32 = 0.0f32 / 0.0f32;
    const INFINITY: f32 = 1.0f32 / 0.0f32;

    impl Float for f32 {
        fn nan() -> Self {
            f32::NAN
        }
        fn infinity() -> Self {
            f32::INFINITY
        }
    }
}
Ассоциированные константы позволяют реализовать всё это намного проще. Трейт будет выглядеть таким образом:
trait Float {
    const NAN: Self;
    const INFINITY: Self;
    ...
}
А его реализация станет намного проще и расшит возможности использования трейта:
mod f32 {
    impl Float for f32 {
        const NAN: f32 = 0.0f32 / 0.0f32;
        const INFINITY: f32 = 1.0f32 / 0.0f32;
    }
}
Ассоциированные константы были предложены три года назад в RFC 195. И мы наконец смогли их реализовать! Этот RFC содержал все виды ассоциированных элементов, не только константы. Некоторые из них мы смогли реализовать быстрее чем другие. Мы много работаем над улучшением поддержки работы с константными выражениями, чтобы увеличить возможности Rust в области мета-программирования во время компиляции. В будущем в этой области появятся дополнительные возможности.

Кроме того, мы исправили ошибку при работе с макросом include! в тестах документации: пути к файлам определялись относительно рабочего каталога, а не каталога, в котором находится файл кода.

Стабилизация библиотек

В этом релизе не произошло значительных изменений в стандартных библиотеках. Внесено несколько полезных улучшений и продолжается работа по стабилизации API.

Макро unimplemented! теперь принимает параметр, в котором можно указать причину отсутствия реализации.

Добавлена поддержка Unicode 10.0.0.

Функции min и max были переписаны на Rust, и больше не используют cmath.

Внедрена защита от уязвимости Stack Clash. Основные изменения: stack probes и отключение дополнительных ручных проверок для стека основного потока. Для включения защиты достаточно скомпилировать проект в Rust 1.20, изменения в коде не требуются.

В стандартную библиотеку добавлены три новые функции сортировки: slice::sort_unstable_by_key, slice::sort_unstable_by и slice::sort_unstable. Как вы заметили, все три содержат «unstable» в названиях. Стабильность — это свойство алгоритма сортировки, которое требуется не всегда, но раньше в стандартной библиотеке не было алгоритмов нестабильной сортировки. Теперь доступны обе возможности! Для демонстрации разницы между этими видами сортировки рассмотрим список:

rust
crate
package
cargo
Список, отсортированный алгоритмом стабильной сортировки только по первой букве, должен выглядеть таким образом:
crate
cargo
package
rust
То есть, если в исходном списке слово crate предшествовало слову cargo, то и в отсортированном списке оно должно стоять первым. Алгоритм нестабильной сортировки тоже может выдать такой результат, но допускается и вариант с измененной последовательностью:
cargo
crate
package
rust
Как вы понимаете, меньшее количество ограничений часто позволяет создать более быстрый алгоритм. Если вам не важна стабильность сортировки, нестабильная сортировка может оказаться быстрее, чем стабильный вариант. Как обычно, лучше попробовать оба варианта и сравнить их скорость. Эти функции сортировки были добавлены в RFC 1884. По ссылке вы можете узнать больше подробностей, включая результаты бенчмарков.

Также были стабилизированы следующие API:

и некоторые другие.

Возможности cargo

Этот релиз внес полезные улучшения в менеджер пакетов cargo. Первое и самое важное: токен аутентификации для crates.io хранился в ~/.cargo/config. Обычно маска доступа для файлов конфигурации устанавливается в 644, то есть чтение разрешено всем. Но в этом файле хранится секретный токен. Мы переместили токен в отдельный файл ~/.cargo/credentials, таким образом для него может быть установлен доступ 600, и он будет скрыт от других пользователей системы.

Если вы использовали пакеты Cargo, создающие дополнительные исполняемые файлы, вы знаете, что их исходный код хранится в src/bin. Но иногда вам может понадобиться создать несколько дополнительных исполняемых файлов, требующих много кода. В этом случае код может храниться в файлах src/bin/client.rs и src/bin/server.rs и все субмодули этих файлов попадут в один каталог, что неудобно и создает путаницу. Теперь мы используем соглашение, что такие файлы как src/bin/server/main.rs и src/bin/client/main.rs также используются для создания дополнительных исполняемых файлов. Это позволяет удобнее разграничить код.

>>> Подробности

★★★

Проверено: Shaman007 ()
Последнее исправление: red75prim (всего исправлений: 3)
Ответ на: комментарий от theNamelessOne

Python давным-давно щупал и тогда юзал functools (тут уже поправили что все это в itertools). Для Ruby указал Collections API, т.к., емнип, реализованы эти функции через примесь к типу коллекции (поэтому extension methods для Kotlin тоже названы Collections API)

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

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

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

Qt не поддерживает виджиты GTK и наоборот. И ничё живут как-то.

Они худо-бедно поддерживают темы друг друга. И у них самая обширная функциональность из линуксовых тулкитов. Как сказали выше, голый X11 даёт гораздо меньше, чем WinAPI и Cocoa. Расту просто необходимы байндинги к обоим :)

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

Не там все уровнем выше компоненты LCL собираются на различных платформах с различным набором тулкитов т.е для macosx можно собрать LCL как с qt так и с cocoa

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

А что у раста когда нибудь будет гуй на расте? Скорее свиньи скакать разучатся.

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

Если б они никогда не имели дел с с++,то и не писали бы про него, какой он весь ужасный. Весь их вой про «убийцу с++» это следствие желания убедить работодателей избавить своих рабов от с++. Иначе зачем выть? Ну пиши на расте чо ты воешь

Написать гуй для них это неподъемная задача. Они ж в кого не плюнь: я бэкэнды пишу, вебмакака, бэкэнды, макака... там даже понимания нет как это делается

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

*я боюсь потерять работу из-за растеров*

*я боюсь потерять работу из-за растеров*

*я боюсь потерять работу из-за растеров*

*я боюсь потерять работу из-за растеров*

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

На него не имеет смысла обращать внимания. У него в ub в его программе виноваты джависты, которые, внезапно, пишут gcc.

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

Написать гуй для них это неподъемная задача. Они ж в кого не плюнь: я бэкэнды пишу, вебмакака, бэкэнды, макака... там даже понимания нет как это делается

Ты прям Лев Толстой. Какой гуй написал ты сам, я так понял, сишники и плюсовики каждый второй гуй пишут, и у них этого понимания ого-го сколько?)

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

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

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

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

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

винапи уныл и ужасен. ну или в винформс на сишарпе упапываются.

Кажется, между двумя этими крайностями, в винду встроено еще с пол дюжины интерфейсов к гуйне?

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

я боюсь потерять работу из-за растеров

Ой-вей, не смешите мои тапочки. Уволенных из мозиллы растеров хватит с избытком на весь рынок. И то, скорее придется им переучитываться на свифт, лол.

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

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

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

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

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

Немного не так:) Свифт гордо возглавляет гей-парад, из-за чего больше нигде ему не рады. А раст активно пристраивается и к параду красноглазых и к анальным рабам и к геям. Всюду размахивает своими достоинствами (владение, зеро кост, идт). И поэтому всюду находит воздыхателей

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

если засунуть эти функции в интерфейс итератора

то ничто не мешает засунуть эти же функции в любой другой интерфейс

то для этих типов встанет проблема необходимости реализации итерирования по ним.

developers gonna develop

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

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

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

Всюду размахивает своими достоинствами (владение, зеро кост, идт)

Это все может и интересно пограмистам, но для менеджеров пустой звук. Ускоряет разработку? Нет, наоборот. Удешевляет рабочую силу? Нет, наоборот. Ну идина тогда. Есть очень узкая ниша, где растофичи были бы интересны. И там сидит Ада плотно.

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

Есть очень узкая ниша, где растофичи были бы интересны

Э не. Ниш много. Высоконагруженные сетевые сервисы, переносимые десктопные приложения, эмбедед. В первом случае конкурент только Go. Во втором - только C++. В третьем - только C. Все 3 конкурента обладают разными неприятными врожденными уродствами, которых нет в расте

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

Нет.
Есть ещё плюсовые МФЦ поверх ВинАПИ, чуть менее унылые чем просто ВинАПИ.
Есть ещё внешняя либа (забыл название) поверх МФЦ, её вроде мелкомягкие недавно купили.
Но итог один - знакомые виндузятники перешли на Кутю.
Т.к. не захотели мудохаться с переносом всего проекта на сишарп или заморачиваться биндингами.

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

Сам балда. Жаба и дотнет - это не системные ЯП. С++ монструозен, костылен и не безопасен. D не может тягаться с Pure C, т.к. имеет GC, а если не использовать стандартную библиотеку, то превращается в недо-плюсы.

А если встаёт выбор между Pure C или Rust, как думаешь что захочет народ? И по поводу рынка, я уже видел вакансии на Rust, но не видел на D - намёк понял?

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

Высоконагруженные сетевые сервисы

И тут ржавый опоздал, нишу забили. Да и зачем такой убер-язычок для столь примитивной задачи.

переносимые десктопные приложения

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

эмбедед

Возможно, но опять же слишком сложно в расте делаются простые веши. Хардкорные сишники не оценят думаю.

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

Бред, особенно про Аду.

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

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

На hh.ru. Рестрим дочка Ростелекома, ProfiStaff, Лаборатория Касперского, BitFury, Вокорд

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

И тут ржавый опоздал, нишу забили

Только Go. Со всеми из него вытекающими

Не смеши. Без ООП, без зачатков гуйни

Только С++. Писать на нем уже зашквар

Хардкорные сишники не оценят думаю

Зависит от качества предоставляемых инструментов. Поживем - увидим

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

Я понимаю. А ты понимаешь, что мишенью для внедрения бэкдоров станет unsafe-код на crates.io?

И, ВНЕЗАПНО найти места, куда нужно внедрять уязвимости тоже легче, unsafe же.

Это помимо бэкдоров в спецификациях и на алгоритмических «ошибках».

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

Возможно, но опять же слишком сложно в расте делаются простые веши. Хардкорные сишники не оценят думаю.

А те кто моложе 60, думаю, очень ждут когда появиться замена для Pure C

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

Высоконагруженные сетевые сервисы,

Если речь про действительно высоконагруженные сервисы, то там C, С++ и Java. Go отъедает нишу у Python, Ruby и Node.js (насколько успешно у последнего еще неизвестно).

переносимые десктопные приложения,

Rust? Серьезно? Да и сам этот сегмент постоянно скукоживается.

эмбедед.

Тут C, С++, Ada и еще какая-нибудь экзотика, вроде Forth. Да и в хардкорном эмбеддеде будет unsafe Rust во все поля, чем это лучше уже живущих там C и C++? Тем более, что в эбмеддеде зачастую программирую бывшие или даже действующие железячники, для которых даже C освоить в нормальной степени проблема.

eao197 ★★★★★
()

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

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

И что же теперь, делать из руста джаву, которая по 20 лет тащит сомнительные дизайн-решения из прошлого?

А что ты хотел? Тут ровно два пути: обрастать легаси костылями или дробить сообщество как в питоне (это в лучшем случае, в худшем язык просто будет никому не нужен).

Вообще в расте придумали «эпохи», возможно, это поможет более удачно такие ситуации разруливать, но так сложность просто перенесётся в компилятор, что тоже не очень здорово.

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

Rust? Серьезно? Да и сам этот сегмент постоянно скукоживается.

А в чём проблема?! rustup default платформа-операционка и вот он уже собирает под другую ОС, список большой

Да и в хардкорном эмбеддеде будет unsafe Rust во все поля

Схренали?! Скорее всего нужно будет писать и читать в порт\память, а это можно не поносить по всему коду, а сделать пару модулей. Один для работы с портами в\в, второй для работы с памятью и то, скорее всего, это уже будет когда получим поддержку микроконтроллеров. С микропроцессорами аля ARM всё ещё проще, разницы с х86 я не ощутил

для которых даже C освоить в нормальной степени проблема.

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

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

то там C, С++ и Java

Ну ты сам понимаешь. C++ это круче чем секс. А java потребует 3000 серверов там, где реально нужно 1000

Rust? Серьезно? Да и сам этот сегмент постоянно скукоживается.

Серьезно. Всё что приходит в голову из десктопа - всё на С++. Скукоживается? И кто же его скукоживает? Неужто обрубки IOS и Android? Скукоживалка не выросла

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

Время покажет. Если сделают среду, по удобству не хуже Arduino, то выстрелит. Предпосылки есть и немалые. Всяко лучше, чем потуги с micropython или .NET micro framework

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

А в чём проблема?!

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

Скорее всего нужно будет писать и читать в порт\память

Если у вас эмеддед такой сложности, то зачем там Rust, если C и так живет там давно и успешно. Да и не только C, но и С++ и Ada.

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

А java потребует 3000 серверов там, где реально нужно 1000

Боюсь, вы льстите и себе и Rust-у. Соотношение 3000 к 1000 — это больше про какой-нибудь RoR/PHP или Django. Java на серверах чувствует себя вполне нормально.

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

Хотя я лично был бы за, если бы Rust потеснил в высоконагруженных сервисах ту же Java. Только боюсь, это не та ниша :(

И кто же его скукоживает? Неужто обрубки IOS и Android? Скукоживалка не выросла

Быстрые релизы огромного масштаба — это про Фэйсбук. Цитата:

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

Может она еще и не выросла, но такими темпами вырастет и перерастет обязательно.

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

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

Я думаю будет обратный процесс, когда всех начнёт тошнить от облаков и серверных говно-технологий, рынок деск-ПО вырастет

Если у вас эмеддед такой сложности, то зачем там Rust, если C и так живет там давно и успешно.

Потому что отладка этого приносит ярую боль плииять! Тем более если есть код на си, то он 100% будет содержать те баги, которые компилятор Rust не пропустит - этого уже достаточно чтобы выбрать Rust.

А живёт Си там давно ТОЛЬКО потому-что не было альтернативы и всё. Реально, в микроконтроллерах юзается только ассемблер и Си, но я ещё не видел ни одного исходника в настоящем проекте на Ада или на микропитон, только игрушечные мигалки, свистелки и перделки.

И если сейчас в Rust появиться официальная поддержка AVR\MSP, то первое что я выброшу - это будет компилятор Си.

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

> Скорее всего нужно будет писать и читать в порт\память

Если у вас эмеддед такой сложности, то зачем там Rust

Ну зачем так нагло и жирно передергивать? О том и речь, что ансейф нужен только для I/O, а остальное — весь ваш сложный эмбеддед можно писать целиком в safe Rust.

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

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

По вашему embedded — это только микроконтроллеры? Вот посмотрите здесь, слайд №7. Это относится к embedded или нет?

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

О том и речь, что ансейф нужен только для I/O

Правда? А что, уже можно в рамках safe Rust-а получить две мутабельные ссылки на один и тот же вектор, например?

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

Через такую структурку вообще всё решается, любая программа - это структурка со стейтом и кодом. Между тем те же замыкания предпочитают добавлять просто потому что удобнее.

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

WinRT еще

Ах да. Забыл про это метро-извращение.

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

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

Соотношение 3000 к 1000 — это больше про какой-нибудь RoR/PHP или Django

Может и льщу. Я всегда думал (а точнее где-то вычитал), что бэкенд на плюсах в 20-100 раз менее прожорлив фреймворка на динамическом языке

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