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)
Ответ на: комментарий от AntonyRF

Мне кажется, что можно сделать так

Ну все, пошла спецолимпиада. Проще надо быть, а раст вас так и подталкивает к акробатике. Никаких проблем с записью a.b.c.d вообще нет. Если таких строк 100500 подряд, тут с алгоритмом какая то жопа, или не хватает выразительности языку.

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

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

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

Можно, и иногда нужно. Например, для реализации транзакционной семантики. А кувыркаться просто потому что x.y.z некрасиво и повторяется, не нужно. With в питоне, насколько я помню, запилили из-за отсутствия многострочных лямбд. Т.е. языку тупо не хватает выразительных средств, и потому сделали костыль для частного случая. Бейсик-стайл.

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

ОК, и как предлагаете выходить из ситуации, когда есть таки объект или переменная a.b.c.d и нужно всячески активно оперировать ею? Передать в функцию, чтобы оно там стало this? Кстати, вы слышали о том, что вызов функции - довольно небесплатная вещь в любом языке?

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

Передать в функцию, чтобы оно там стало this? Кстати, вы слышали о том, что вызов функции - довольно небесплатная вещь в любом языке?

Я слышал, что в современных компиляторах есть inline и LTO.

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

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

Плохо помнишь, RTFM.

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

Кстати, вы слышали о том, что вызов функции - довольно небесплатная вещь в любом языке?

Времена 8битных устройств прошли.

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

вызов функции - довольно небесплатная вещь

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

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

Шо, опять объяснять?
Не понял, про какие лямбды идет речь, как и этот пассаж:

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

Википедия описывает RAII так.
Юзкейс для with как менеджера контекста иллюстрирует типовой пример:

f = open("file")
try:
    # выполняем какие-то манипуляции с открытым файломfinally:
    # ветка `finally` гарантированно выполняется, и мы гарантированно закрываем файл
    f.close()
Это идиоматичный код: захватываем ресурс, работаем с ним и гарантированно освобождаем его, исключая порчу данных. Но это тупой код (в ветке `finally` механическое набивание освобождения ресурса), и для этого используется констукция try/except/finally, чье прямое назначение всё-таки отлов исключений. Налицо необходимость в новой фиче, осенило ГВР, и он выдал на-гора не только with, но и механизм для создания собственных вундервафлей для работы с произвольными пользовательскими ресурсами с помощью этого with. И назвали этот механизм context manager.
Вышеприведенный пример, будучи переписан, выглядит так:
with f = open("file"):
    # выполняем какие-то манипуляции с открытым файлом
Как только заканчивается блок with, файл будет автоматически закрыт. То есть здесь файл сам по себе выступает как менеджер контекста.
Понятное дело, под капотом всё та же кака с try/finally, но ее нужно писать только один раз — в самом менеджере контекста, а в остальном коде будет ляпота (осторожно, паста):
@contextmanager
def stdout_redirected(new_stdout):
    save_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout = save_stdout

with open(filename, "w") as f:
    with stdout_redirected(f):
        print "Hello world"
Открываем файл, перенаправляем в него стандартный поток вывода, печатаем в него «привет мир», возвращаем всё обратно, как было, закрываем файл. И всё это абсолютно в рамках exception safety. По-моему, очень классно.
Да, здесь нет «сахарку» из фри-бейсика, придется явно писать f.metod() и т.д.

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

Аналог на Ruby:

def with_stdout_redirected_to file
  original_stdout = $stdout.clone
  $stdout.reopen file
  yield
  $stdout.reopen original_stdout
end

File.open '/tmp/file', 'w' do |file|
  with_stdout_redirected_to file do
    puts 'this will be written to the file'
  end
  puts 'this will be written to stdout'
end

Было бы здорово, если бы в Python добавили поддержку многострочных лямб, чтобы можно было создавать DSL'и вроде teacup.

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

Не добавят в Питон многострочные лямбды, никогда. Поэтому никаких ДСЛ на Питоне не будет.

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

Налицо необходимость в новой фиче, осенило ГВР, и он выдал на-гора не только with, но и механизм для создания собственных вундервафлей для работы с произвольными пользовательскими ресурсами с помощью этого with.

Вечно с ним такое. Говнокодит костыли вместо того, чтобы запилить нормальные абстракции.

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

нормальные абстракции

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

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

У хейтеров уже стулья сломались под весом нагара.

Мне из новых фич больше всего понравились union'ы (теперь дождаться когда их прикрутят к bindgen'у) и приведение чистых лямбд к указателю на функцию.

А стандартная библиотека развивается, медленно но верно. Ждём аллокаторов и asm! в stable.

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

У хейтеров уже стулья сломались под весом нагара.

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

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