Rust 1.85.0: Революция языка и новые возможности в рамках Rust 2024

20 февраля 2025 года был анонсирован выпуск языка программирования Rust версии 1.85. Данная версия отмечена как Rust 2024, что обозначает официальную стабилизацию изменений, представленных за последние три года. Редакция языка Rust 2024 будет служить основой для расширения функциональности на следующие три года, подражая тому, как версия Rust 2021 стала базисом для evolyucii языка за прошедшие три года. Выпуск версии Rust 1.80 состоялся в июле 2024 года.

Чтобы поддерживать совместимость, разработчики могут применять метки 2015, 2018, 2021 и 2024 в своих приложениях, что позволяет привязывать код к определенным версиям языка, соответствующим активным редакциям Rust. Эти редакции были введены для разделения несовместимых изменений и могут быть настроены в метаданных пакетов cargo через поле edition в секции [package].

Например, редакция 2021 включает стабильные функции на конец 2021 года и охватывает все последующие изменения, которые не нарушают совместимость. В свою очередь, редакция 2024 включает дополнительные изменения, нарушающие совместимость, представленные в текущем выпуске 1.85 и одобренные для внедрения в будущем. Редакции также учитывают состояние инструментария и документации. Для автоматического обновления кода под новую редакцию языка можно воспользоваться командой cargo fix.

По данным OpenNET, Rust сосредотачивается на безопасной работе с памятью и предлагает средства, обеспечивающие высокий уровень параллелизма выполнения задач. При этом он не требует использования сборщика мусора и runtime (который сведен к базовой инициализации и управлению стандартной библиотекой).

Методы работы с памятью в Rust позволяют избежать ошибок, связанных с указателями, а также предотвращают проблемы, возникающие при низкоуровневой работе с памятью, такие как доступ к памяти после ее освобождения, разыменование нулевых указателей, выход за пределы буфера и другие. Для распределения библиотек, упрощения сборки и управления зависимостями проект активно использует пакетный менеджер Cargo, поддерживающий репозиторий crates.io для размещения библиотек.

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

В списке основных обновлений и дополнений в Rust 1.85 можно выделить:

– внедрение поддержки асинхронных замыканий, определяемых с помощью “async || {}”, которые функционируют аналогично асинхронным функциям (async fn);

добавление атрибута “#[diagnostic::do_not_recommend]”, который исключает аннотированные реализации типажей из диагностических сообщений компилятора;

– возможность использования типажей FromIterator и Extend с кортежами, содержащими до 12 элементов – от “(T,)” до “(T1, T2, .., T11, T12)”;

– реализация второго уровня поддержки платформы powerpc64le-unknown-linux-musl, что подразумевает гарантии сборки.

Некоторые ключевые несовместимости, выявленные в Rust 2024:

изменено поведение захвата параметров в «impl Trait», если не применяется новый синтаксис «use<..>», указывающий на скрытые типы. Теперь в Rust 2024 параметры в области видимости будут неявно захватываться, если не используется «use<..>». Для ограничения захвата следует использовать «use<..>», например, «impl Trait + use<‘x, T>» указывает, что разрешено использовать только параметры «x» и «T» в скрытом типе;

– изменена область видимости временных значений в конструкциях «if let». Теперь временные значения, полученные в блоке $expr, будут удалены до переключения на блок «else»;

– область видимости временных значений в хвостовых выражениях, завершение функции, блока или замыкания, также была изменена, и теперь такие значения очищаются до локальных переменных;

– ограничены некоторые неоднозначные варианты использования mut, ref, ref mut, & и &mut в шаблонах; замените, например, «let [x, mut y] = &[(), ()];» на «let &[ref x, mut y] = &[(), ()];»;

– блоки «extern» теперь обязаны быть помечены ключевым словом «unsafe»;

– атрибуты export_name, link_section и no_mangle должны также сопровождаться ключевым словом «unsafe»;

– включено предупреждение «unsafe_op_in_unsafe_fn» по умолчанию для контроля обрамления блоками «unsafe {}» функции, работающей с небезопасным кодом;

запрещено использовать ссылки на элементы, объявленные как «static mut»;

– Lint-проверка «never_type_fallback_flowing_into_unsafe» теперь активируется по умолчанию в режиме «deny»;

– в спецификатор «expr» добавлена поддержка выражений «const» и «_»;

– Lint-проверка «missing_fragment_specifier» переведена в режим ошибки;

резервируется ключевое слово «gen», которое будет использовано в будущем для генераторов;

забронировано определение строк ‘#»foo»#’ и токены ‘##’;

– в стандартной библиотеке теперь автоматически импортируются типажи Future и IntoFuture. В структуру «Box<[T]>» добавляется типаж IntoIterator. Функции std::env::set_var, std::env::remove_var и std::os::unix::process::CommandExt::before_exec помечены как unsafe;

– в пакетном менеджере Cargo по умолчанию внедрен новый механизм обработки зависимостей, который выбирает версии компонентов, учитывая совместимость с минимально поддерживаемыми версиями компилятора Rust (MSRV, Minimum Supported Rust Version). Некоторые устаревшие ключи в Cargo.toml были удалены. В зависимости запрещается использование режима «default‑features = false», если она унаследована от пакета с установленным значением «default‑features = true» или без параметра «default‑features»;

– тесты doctest в Rustdoc теперь объединены в один исполняемый файл. При использовании doctest через «include_str!» файл пути теперь вычисляется относительно Markdown-файла, а не файла с кодом;

– в Rustfmt предложена концепция редакций стиля форматирования. Логика сортировки идентификаторов была изменена.

В процессе разработки Rust 1.85 приняли участие 742 разработчика.