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)

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

Спасибо за ссыль, растет раст, ох растет.

Пару нубовопросов: а в расте как и в сях желательно разделять объявление и определение на два разных файла? Вот этот танец при изменении сигнатуры: лезть в соседний файл и править надоедает. Есть ли уже инструменты для дебага? На емакс? Растоманы наркоманы или нет?

Мамкиному анонимусу тоже спасибо за ответ. DearAmomynous

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

Нет, желательно не разделять, всё пакуется по модулям. В комплекте есть rust-gdb и rust-lldb, можно ли их прикрутить к емаксу - хз. И такие, и другие бывают.

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

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

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

Хорошо, не шутник, сколько в тебе калорий? А то я не ужинал, а ты похож на десерт :З

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

Скорее всего он не использует ничего из системы, например добавить в игру акселерометр/гироскоп это явно не две строчки в Cargo.toml. Хотя может быть я не прав, но нужно иметь более одной игры чтобы показать состоятельность платформы.

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

например добавить в игру акселерометр/гироскоп это явно не две строчки в Cargo.toml

Тем временем даже самые простые приложени в андроиде(речь не о расте) занимаю мегабайты. К примеру фонарик весит 14 Мб.

NextGenenration ★★
()

Кстати, в Slackware-current уже притащили rust. На данный момент он там версии 1.19.0, но мне удалось с плясками собрать пакет 1.20.0: https://yadi.sk/d/YcpPmDWV3MXjCG . Слакбилд пока не выкладываю, поскольку до конца не разобрался в этой магии. Официально из исходников Патрик выложил только rustc-$VERSION-src.tar.xz, и этого, вроде как, должно хватать. Но, без rustc-$VERSION-x86_64-unknown-linux-gnu.tar.xz, rust-std-$VERSION-x86_64-unknown-linux-gnu.tar.xz и cargo-$VERSION-x86_64-unknown-linux-gnu.tar.xz слакбилд отказывался работать. А потом сборочный скрипт начал заново качать эти тарболы. Вероятно, этот момент пока ещё неотлажен, а наступил я на эти грабли потому, что у меня до сих пор rust и cargo были со slackbuilds.org. А rust там старой версии. Настолько старой, что отказывался собирать новый rust с ошибкой «error: struct field shorthands are unstable (see issue #37340)». Пришлось удалить. А без rust'а в системе остаётся жонглировать дополнительными тарболами. Видимо, Патрик собирал пакет за пакетом, и на определённом этапе перестал удалять rust из системы.

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

Он тролль. Ему в каждой теме говорят, что в расте нет GC, не обращай внимания.

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

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

pftBest ★★★★
()

Посколько все любят пинать синтаксис Rust, интересен RFC 2115 который вероятнее всего будет принят.

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

fn two_lifetimes<'a, 'b>(arg1: &'a Foo, arg2: &'b Bar) -> &'a Quux<'b>

Становится чуть менее вырвиглазным:

fn two_lifetimes(arg1: &'a Foo, arg2: &'b Bar) -> &'a Quux<'b>

Конкретно в вышеприведенном примере, отменяется необходимость писать <'a, 'b> после имени функции.

Пример с имплементацией трейтов аналогично упрощен. Вместо:

impl<'a, 'b> SomeTrait<'a> for SomeType<'a, 'b> { ... }

Пишем:

impl SomeTrait<'A> for SomeType<'A, 'B> { ... }
gene1
()
Ответ на: комментарий от saahriktu

А вообще в чем смысл собирать с ситемным LLVM? Оно все равно линкуется статически, так что места на диске этим не сэкономишь. А по качеству он будет точно хуже.

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

А вообще в чем смысл собирать с ситемным LLVM? Оно все равно линкуется статически, так что места на диске этим не сэкономишь. А по качеству он будет точно хуже.

Ну, Патрику, видимо, пока ещё это не подсказали. Поэтому в его слакбилде так (в соавторах там ещё Andrew Clemons из Новой Зеландии; тот самый, который готовит слакбилды rust'а для slackbuilds.org).

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

А как их, кстати, запускать?

make check

или

./x.py test

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

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

Гм.

error: failed to run custom build command for `rustc_llvm v0.0.0 (file:///tmp/rustc-1.20.0-src/src/librustc_llvm)`
process didn't exit successfully: `/tmp/rustc-1.20.0-src/build/x86_64-unknown-linux-gnu/stage0-rustc/release/build/rustc_llvm-2cbf91b62bcfdc3f/build-script-build` (exit code: 101)
...
cargo:warning=c++: ошибка: unrecognized command line option «-Wcovered-switch-default»
cargo:warning=c++: ошибка: unrecognized command line option «-Wstring-conversion»
exit code: 1

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

Погрепал по исходникам, эти флаги есть только в cmake файлах самого LLVM. Можешь попробовать закомментить их там.

Может быть когда ты запустил тесты оно пошло собирать все заново со стандартными опциями и своим LLVM, зашло туда, нашло непонятные флаги и вывалилось.

Может поэтому Патрик и собирал с системным LLVM, потому что свой не компилится в слаке?

pftBest ★★★★
()

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

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

Теперь доступны обе возможности!

Это, конечно, здорово, но почему стабильность навязывается по умолчанию, а не наоборот?

Еще спроси, почему по умолчанию предлагается стабильная версия, а “ночнушку” надо скачивать отдельно, если она более фичастая.

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

О, спасибо, а то гуглил «rust streams/reactive», а они это в итераторы засунули =)

readLines().filter(...)
           .map(...)
           .take(n)
           .collect(...);

Вообще-то filter/map/take это классические техники ФП, а в императивных ЯП их обычно и реализуют с помощью итераторов.

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

сам ozkriff

ozkriff - какой-то серьезный парень? значимая фигура? просьба прояснить кто такой сам ozkriff

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

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

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

Из того, что мне известно, пилит инди-игрушку на Расте. Раньше публиковал новости о релизах Раста на ЛОРе, но потом исчез, видимо, местные срачи ему не по душе.

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

пилит инди-игрушку на Расте

сам пилит? =-О весомый человек, уважуха! таких как он сейчас не найти!

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

График релизов — 1 раз в 6 недель. Тебя смущает, что он выполняется?)

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

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

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

Таки нет, но да. Т.е. да, это одно и то же, но раст у мамы особенный и в нём все функции статические, пока не сказано сделать иначе - «динамическими», указав первым аргументом «self». Поэтому, ИМО, звать их статическими не имеет смысла, но возможно я просто поехавший.

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

Претензия твоего оппонента ясна и понятна: есть устоявшийся термин, и нечего плодить новые сущности-синонимы для того же. Но это вопрос к терминологии применительно к Расту. Другое дело, что статические функции/методы родом из ОО ЯП, а Раст вроде как к ним не относится, так что какого хрена. По мне что то название, что другое — неинтуитивные сорта сами знаете чего.

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

раст у мамы особенный

Эта особенность Раста вместе с self'ом позаимствована у Питона. В нем статические функции имеют место быть и выглядят точно так же :)

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

С такими заявлениями у меня возникают мысли «да пошло оно всё ***уй» и пойти в менее болезную область, например в дизайнеры.

Готов по просьбе заказчика «поиграть со шрифтами»?

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

А нынешние тенденции писать на гуане меня огорчают.

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

Разбудите, когда на нём начнут что-то писать.

Т.е. тебя не будить?

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

Там даже на ; жалуются. Так себе показатель.

Компилятор Rust настолько туп, что не может найти конец строки без ";"? И это в XXI то веке? Ужс.

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

Всё намного хуже. Он и вложенный блок без костылей вроде {} найти не может!

makoven ★★★★★
()
    impl Float for f32 {
        const NAN: f32 = 0.0f32 / 0.0f32;

Такими темпами скоро структуры в языке больше не понадобятся )

А тип этой константы может быть не настоящий, а trait bound?

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

Тебе, деревне, нужно рассказать что такое expression-oriented programming language и что `;` делает из expression statement?

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

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

Говорю же, у всех уже век XXI и только растоманы всё ещё запрягают.

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

ООП тут как бы и не при чём. Статическая функция как бы находится внутри класса, но вызывается без объекта данного класса. В Расте можно добавить свой трейт со «статической» функцией и реализовать его для чужого типа, например:

 trait Foo{
    fn foo()->Self;
}

impl Foo for i32{
fn foo()->i32 {1}
}


fn main() {
    println!("i32::foo(): {}", i32::foo());
}
Получается, будто я добавил свою статическую функцию во встроенный тип, что бредово. Соответственно использовали другой термин, я не «добавил статическую функцию», а ассоциировал простую функцию с типом i32.

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

Чувак, ты отстал от жизни. Уже в конце 20го века был джаваскрипт, который и точки с запятой расставлял и переменные позволял не объявлять и даже поля в объектах. В 21м веке нужен наконец язык, который сам будет алгоритм реализовывать.

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

Ясно. Можешь не лечиться, только эвтаназия.

Deleted
()

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

Чем то своей прожорливостью и тормознутостью напоминает цпп, этакий современный тормоз на новый лад. Плюсовики порадуются, найдя всё те же застарелые привычки в новом от мозиллы!

Во всём остальном всё ок, всем советую в качестве терминала связку alacritty+tmux.

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

Чем то своей прожорливостью и тормознутостью напоминает цпп, этакий современный тормоз на новый лад.

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

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