Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.33.0. Rust — это язык программирования, который дает возможность каждому создавать надежное и эффективное программное обеспечение.


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


$ rustup update stable

Если у вас еще не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.33.0 можно ознакомиться на GitHub.


Что вошло в стабильную версию 1.33.0


Основные улучшения этого выпуска: значительное расширение возможностей const fn и стабилизация нового Pin API.


Расширение возможностей const fn


const fn теперь умеет гораздо больше, а именно:


  • безусловное (irrefutable) сопоставление с образцом (например, const fn foo((x, y): (u8, u8)) { ... })
  • let привязки (например, let x = 1;)
  • изменяемые let привязки (например, let mut x = 1;)
  • выражения присваивания (например x = y) и операторов присваивания (например, x += y), включая присваивание проекциям (например, полю структуры или результату оператора индексирования — x[3] = 42)
  • инструкции выражений (expression statements) (например, 3;)

Еще теперь можно вызывать "const unsafe fn" из "const fn", например:


const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
    unsafe { foo() }
}

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


Pin API


Данный выпуск привносит в язык новый механизм, представленный типом std::pin::Pin и маркерным типажом Unpin. Основная идея подробно описана в документации "std::pin" модуля:

Иногда может быть полезно запретить перемещение объекта, т.е. гарантировать неизменность его адреса в памяти. Основным сценарием использования такой возможности являются самоссылающиеся структуры, поскольку перемещение таких объектов приведет к инвалидации указателей, что может привести к неопределенному поведению (UB).

Pin<P> гарантирует, что объект, на который ссылается любой указатель типа P, имеет неизменное расположение в памяти, т.е. он не может быть перемещен и его память не может быть освобождена. Такие значения называются "закрепленными" ("pinned").

Ожидается, что этот механизм будет использоваться в основном авторами библиотек, поэтому мы сейчас не станем погружаться глубже в детали (с которыми можно ознакомиться в документации по ссылке выше). Однако, стабилизация этого API является важным событием для всех пользователей Rust, потому что является ключевым этапом на пути к очень ожидаемому async/await. За статусом оставшейся работы в этом направлении можно следить на areweasyncyet.rs.


Импортирование как "_"


Теперь можно импортировать сущности как "_". Это позволяет импортировать реализации типажа без занесения его имени в текущее пространство имен, например:


use std::io::Read as _;

// Тут не возникнет конфликта имен:
pub trait Read {}

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


Стабилизация стандартной библиотеки


Вот список всего, что стало константным:



Кроме того, стабилизированы следующие API:



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


Улучшения в Cargo


Теперь cargo пересобирает крейт, если какой-то из его файлов был изменен во время изначальной сборки.


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


Crates.io


Как было объявлено ранее, начиная с этого выпуска crates.io будет требовать подтверждения почтового адреса для публикации крейтов. Начиная с 2019-03-01 00:00 UTC выполнение cargo publish будет завершаться с ошибкой для учетных записей без подтвержденной почты.


Это необходимо для соответствия требованиям DMCA. Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках, зайдите в crates.io/me для указания и подтверждения вашей почты. Данный почтовый адрес никогда не будет опубликован и будет использован исключительно для непосредственного функционала crates.io.


Разработчики 1.33.0


Множество людей совместно создавало Rust 1.33. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!

Комментарии (18)


  1. snuk182
    01.03.2019 14:22
    +1

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


  1. Cheater
    01.03.2019 14:42

    rustup update stable

    Кто-нибудь может плз объяснить, почему бы этим не заниматься пакетному менеджеру дистрибутива?


    1. Cerberuser
      01.03.2019 14:52
      +1

      Во-первых, кто будет каждые шесть недель оперативно выкатывать обновления во все репозитории? Во-вторых, rustup всё равно не лишний, хотя бы как и менеджер версий (не так и мало тех, кому нужны одновременно установленные stable и nightly или, скажем, x86_64 и wasm).


      1. Cheater
        01.03.2019 15:01

        Во-первых, кто будет каждые шесть недель оперативно выкатывать обновления во все репозитории?

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

        не так и мало тех, кому нужны одновременно установленные stable и nightly или, скажем, x86_64 и wasm

        Известные мне менеджеры пакетов поддерживают одновременно наличие различных версий пакета в системе. У меня прямо сейчас стоят gcc7 и 8 под x86-64 и gcc под arm.


        1. Gorthauer87
          02.03.2019 11:35

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


    1. Draugdor
      01.03.2019 14:55

      У меня Windows тут всё ясно, Gentoo nightly релизы пересобирать придется из исходников постоянно, это тяжеловато, Freebsd задержка в релизе заметная.


    1. humbug
      01.03.2019 14:56
      +1

      Потому что rustup умеет больше, нежели пакетный менеджер. Во-первых, скорость доставки выше, пока там еще соберут rustc из исходников. Во-вторых, rustup умеет ставить не только nightly/beta/stable, но и переключаться между версиями, устанавливать тулчейны для кросскомпиляции в другие архитектуры, устанавливать компоненты вроде clippy, fmt… и т.д.


      1. Cheater
        01.03.2019 15:08

        умеет больше, нежели пакетный менеджер

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

        rustup умеет ставить не только nightly/beta/stable, но и переключаться между версиями

        apt тоже (+ update-alternatives)
        устанавливать тулчейны для кросскомпиляции в другие архитектуры

        apt тоже
        устанавливать компоненты вроде clippy, fmt

        почему не сделать их пакетами дистрибутива, зависящими от rust?


        1. Alexey2005
          01.03.2019 16:57
          +2

          вы представляете, что будет, если каждый пакет в вашем дистрибутиве будет считать, что он лучше системного менеджера пакетов знает, как обновляться?
          А в сфере разработки давно уже так и есть. Всё, что связано с npm, например TypeScript, обновляется не через системный менеджер. WebStorm тоже не из репа, а самостоятельно обновы качает. Всё, что в Python-инфраструктуре, обновляется через pip.
          STM32CubeMX и прочее для разработки под stm32 обновы само качает. Android Studio само качает. Google Cloud SDK сам качает, MS Azure то же самое.
          Ну и так далее.


        1. Gorthauer87
          02.03.2019 11:40

          Потому что это не так гибко и просто. Для разработки это неудобно.


    1. ozkriff Автор
      01.03.2019 15:15

      Хм, а почему не про Cargo вопрос? Системные пакетные менеджеры библиотеки ставить умеют же.


      1. Cheater
        01.03.2019 15:24

        Сrates гораздо ближе к пользовательским данным, чем к системным компонентам (т.е. я не вижу проблем чтобы иметь общесистемные crates и crates в .cargo одновременно. В perl я точно так же имею общесистемные плагины в /usr/share/perl5 и плагины, установленные в /home через metacpan — последнее ест-но на свой страх и риск). А вот компилятор Rust точно системный компонент.


    1. ozkriff Автор
      01.03.2019 15:20

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


      1. Cheater
        01.03.2019 15:29

        Спс, я не знал про это, теперь ситуация понятнее


    1. technic93
      02.03.2019 13:09

      Большая фрагментация Линукс. Нужно оперативно доставлять все апдейты, в том числе и nightly. Во многих дистрах есть раст в пакетном менеджере, но не самой свежей версии.


  1. AngReload
    01.03.2019 20:23

    Черт. До этого поста даже не подозревал что const fn могут работать не только с костантантными параметрами во время компиляции, но и как обычные функции.


  1. whitemonkey
    02.03.2019 17:18

    А почему в любом посте про Rust, слово Rust повторяется с неимоверной частотой?


    1. ozkriff Автор
      03.03.2019 00:41

      В принципе, парочку повторений в русском варианте можно бы и убрать без потери смысла, но на весь текст новости "Rust" всего восемь раз используется, я бы не сказал что это как-то очень много.