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

a = uint32(6) // тоже вполне себе присваивание

a = 6 as u32

with я показал просто в качестве примера того, чего нет в rust, а надо бы

Зачем?

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

Зачем писать длинное function, если можно написать короткое fn, funс, def или sub? Про let уже ответили.

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

Я написал про ML-подобные ЯП. Какое отношение имеет Lisp (кстати, в какой параллельной вселенной он стал вдруг популярным, если даже на ЛОР'е его адептов практически уже не видно и не слышно?) к функциональщине?

а вот назачем rust'у слово let и почему function сокращено до какого-то огрызка - вот это не вполне понятно

А пойти и почитать лень?

let foo = 1 // ок, выглядит как обычная переменная
let (x, y) = (1, 2); // опа, а это что такое?
let в левой части принимает не идентификатор создаваемой переменной, а шаблон (то есть здесь имеет место быть паттерн матчинг), который сопоставляется с правой стороной, так что это не банальная привязка единичной переменной к значению.
«fn» — в ходе обсуждения победил такой вариант. А что, где-то лучше, кроме джаваскрипта, в котором от «function» плюются? Перловый sub, питоний def, прочие defun'ы?

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

Можно так:


let Foo { a: a, b: mut b } = foo;
[\code]

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

Не, лучше как в C - "-йником. Как это читать, кстати? Ыйником?

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

Ну и как ты его читаешь? Фен? Глаз же спотыкается. Гласные не просто так в языке. Ну это конечно ерунда, но добавляет упорину.

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

with я показал просто в качестве примера того, чего нет в rust, а надо бы

Может ты сам выдумал минусы и приписываешь это Rust'у?

Вот часть твоего примера

poi is Point(float,label)

with poi
  .x=10.237
  .y=-1.9
  .tooltip='WaterCloset here'
end with

Вот как это в Rust

let poi = Point { 
                    x: 10.237, 
                    y: -1.9,
                    tooltip = "WaterCloset here"
                };

Можно потом ещё обновить структуру

let poi = Point { x: 123, y: 321, .. poi};

Ну и нахрена нужен where?

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

Да, это тоже песец. Какие то иудеи все это придумали не иначе.

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

Еще про let.
Есть такая штука как «затенение» («shadowing») переменной. Пример из доки:

let spaces = "   ";
let spaces = spaces.len();
То есть можно не придумывать разные имена для временных переменных, которые нужны только для временного хранения промежуточного результата. Выбрал одно и используй в рамках одного блока кода. К тому же, как видно в приведенном примере кода, тип такой перепривязываемой переменной может меняться (в данном случае со &'static str на i32).
Кошерность идеи сомнительная, удобство — безусловное.

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

«Эф-эн». Но накуя его читать? Он нужен парсеру Раста, чтобы тот понял, что начинается объявление функции или метода. Я визуально определяю, что это функция и сразу пялюсь на сигнатуру, это самое важное. Если, конечно, надиктовывать программный код по телефону, то, наверное, возникнут неудобства ).

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

Мозгу тоже парсить приходится. Хороший кейворд для определения не помешает, def например. Взяли же let для биндинга, это хороший вариант, а можно было бы упороться с каким нибудь bnd.

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

Мне не кажется, что «def» — хорошее ключевое слово для функции. Ну что такое «definition» (до него еще и додуматься надо!)? «Определение»? «func» получше, но «function» кажется уже ужасно длинным, особенно когда, как в JavaScript, оно же используется для безымянных функций.

Да хорош уже. Всё равно ты не опустишься до того, чтобы писать на Расте, так ведь?

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

Мне не кажется, что «def» — хорошее ключевое слово для функции.

Сишников будет смущать, да.

Всё равно ты не опустишься до того, чтобы писать на Расте, так ведь

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

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

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

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

Подкинь, плиз, еще дровишек, а то что-то срач застопорился))).

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

В принципе вместо def и func может быть lol и кардинально это ничего не изменит. Обычно не читаешь простыню кода подряд как книгу, а ищешь начало и смотришь уже на сигнатуру и семантику конкретной функции. Сгодится даже ololololo, но это просто увеличит длину сообщения непонятно ради чего.

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

Там типа запятая была, мол fun из F# и вариант из Си и Си++

AntonyRF ★★★★
()

Что сиси плюплюшники уже поняли, что Rust лучший ЯП? =)

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

Ну какой-то прям даже не интересный вброс =\

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

В принципе вместо def и func может быть lol

Одобряю. Очень гармонично смотрится.

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

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

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

Ага, а вторая половина как бараны в плюсы\питон уткнулись и ни чего вокруг не видят. Вон там какие-то придурки выше обсуждали, что fn хреновое ключевое слово и типа более упоротый питоний def лучше -__- От куда они только лезут?!

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

Это всего лишь одно из мнений. Другое — распространение библиотек в формате MIR (когда его стабилизируют) и фиксированный LLVM.

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

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

Давайте вбросим на вентилятор сообщений для обсуждения =)

Лайфхак: спорить можно с собой

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

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

Будут, возможно. Когда - скорее всего никогда. Пока все фанбои языков со своими «всеми манямирками» идут лесом. Нормальные разработчики используют только то, что опакечено. И иногда интересуются, что там фанбои в своих песочницах нагенерили, может что то в пакеты упаковать.

Посмотри на git и его зависимости в linux'ах. Все просто.

anonymous
()

Растофилы, а вы кто такие и чем знамениты? Чего на написали выдающегося кроме helloworld'ов и лабораторных вообще и на Rust в частности?

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

Лол, ты же анонимус, ничтожество, кто ты вообще такой что бы задавать вопросы?

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

Такое впечатление, что твоя аватарка - это и есть твоя фотография.

P.S. Вообще-то ровно так присваивание работает в Julia, если нужно форсировать компилятор присвоить переменной тот тип, который нужно тебе , а не тот, который он сам сочтёт нужным присвоить.

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

Йой, бро, спокуха, это ж ты так и не назвал вообще ни одной вещи из перечисленных мной, которые ЕСТЬ в растоманском.

Ни операторов типа With, существенно сокращающих объём кода, ни дженериков для ограниченного набора типов данных, ни самих типов данных, хоть немного интеллектуальнее дубовых uint'ов и прочего примитивного шита.

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

На Rust'е написан дерьмовый движок Firefox, который с каждым новым релизом становится тормознее, а течёт всё так же. Это ж достижение, вообще «флагманский продукт» на растоманском языке!

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

На Rust'е написан дерьмовый движок Firefox

4.2

такое ощущение, что у тебя медаль донора головного мозга

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

На Rust'е все еще не написан дерьмовый движок Firefox

Слегка пофиксил.

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

ты еще и машину времени у ФСБ спёр, вражеская гнида?

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

Думаю ниче они не перепишут, мозилла раньше рипнется. Помню оперу 3 раза что ли переписывали с нуля, не помогло. Рынок не прошибешь обещаниями коммунизма.

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

Когда я говорил и дерьмовом синтаксисе с мозгодробительными скобочками я имел в виду вот это (из педивикии) :

Указатели со счётчиком ссылок (Rc<T>) и с атомарным счётчиком ссылок (Arc<T>) Умные указатели с подсчётом ссылок, уничтожающие объект и освобождающие память при обнулении счётчика. Arc реализует потокобезопасность для счётчика ссылок (но не для самого объекта). Rc и Arc контролируют неизменяемый объект, поэтому типичное их использование выглядит как Rc<Cell<T>> в однопоточной программе и Arc<Mutex<T>> в многопоточной.

За «Rc<Cell<T>>» нужно просто убивать, это только выродок какой-то мог такой синтакис придумать.

DRVTiny ★★★★★
()
Последнее исправление: DRVTiny (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.