[Перевод] Rust 1.77.0: C-подобные строки, offset_of!, рекурсивные async fn, strip в release-профилях

297719f1c096bd578f0e20a30cc75445

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

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

$ rustup update stable

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

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.


Что стабилизировано в 1.77.0

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


Литералы C-подобных строк

Теперь Rust поддерживает литералы C-подобных строк (c"abc"), которые представляются в памяти типом &'static CStr и преобразуются в строки, заканчивающиеся на nul-байт. Это облегчает написание кода, взаимодействующего с интерфейсами тех языков, которым необходимы строки, заканчивающиеся на nul. При этом сохраняются все соответствующие проверки на ошибки (например отсутствие nul-байта) во время компиляции.


Поддержка рекурсивных async fn

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

Это означает, что теперь работает подобный код:

async fn fib(n: u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
   }
}


offset_of!

В 1.77.0 стабилизирован макрос offset_of!, что обеспечивает доступ к байтовому смещению соответствующего публичного поля структуры. Этот макрос наиболее полезен, когда требуется смещение поля без существующего экземпляра типа. Реализация такого макроса уже возможна в stable, но без экземпляра типа для реализации потребовался бы сложный unsafe-код, который с лёгкостью позволяет неопределённое поведение.

Теперь пользователи могут получить доступ к смещению публичного поля с помощью offset_of!(StructName, field). Это расширяется до выражения usize со смещением в байтах от начала структуры.


Включение strip в release-профилях по умолчанию

Профили Cargo, которые не включают в выводе debuginfo (например debug = 0), теперь по умолчанию включают strip = "debuginfo".

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

Пользователи, которым необходим debuginfo, могут явно включить его с помощью флага debug в соответствующем профиле Cargo.


Стабилизированные API


Прочие изменения

Проверьте всё, что изменилось в Rust, Cargo и Clippy.


Кто работал над 1.77.0

Многие люди собрались вместе, чтобы создать Rust 1.77.0. Без вас мы бы не справились. Спасибо!


От переводчиков

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

Данную статью совместными усилиями перевели TelegaOvoshey и funkill.

© Habrahabr.ru