Выпуск Rust 1.33

Автор оригинала: The Rust Release Team
  • Перевод

Команда разработчиков 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. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!

Поделиться публикацией

Похожие публикации

Комментарии 19

    +4

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

      +1
      rustup update stable

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

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

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

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

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

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

            +1

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

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

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

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

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

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

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

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

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

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

                    0

                    Потому что система — это одно, а пользовательские эксперименты — это другое.
                    Точно так же при разработке на других языках — что там у себя ставят разработчики — никак не влияет на работу системы в целом. А когда доставляется конечный продукт — он запаковывается по всем правилам.
                    В той же Gentoo ничто не мешает сосуществовать системно устанавливаемому rustc, которым собираются различные пакеты, и пользовательскому, устанавливаемому через rustup, в который пользователь может наустанавливать не нужных в системе компонентов, возможно весьма "экспериментальных", не говоря уже о том, что не тестировавшихся на совместимость.
                    То же касается и библиотек. Многие библиотеки доступны в комплекте дистрибутива, но зачастую они там совсем не той версии, что нужна разработчику и поддержка нескольких установленных версий — далеко не всегда имеется. Поэтому библиотеки тянутся в проект в обход пакетных менеджеров, и хорошо, если у языка есть свой пакетный менеджер для этого.

                  +1

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

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

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

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

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

                      0

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

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

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

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое