Команда 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
array::each_ref
array::each_mut
core::net
f32::round_ties_even
f64::round_ties_even
mem::offset_of!
slice::first_chunk
slice::first_chunk_mut
slice::split_first_chunk
slice::split_first_chunk_mut
slice::last_chunk
slice::last_chunk_mut
slice::split_last_chunk
slice::split_last_chunk_mut
slice::chunk_by
slice::chunk_by_mut
Bound::map
File::create_new
Mutex::clear_poison
RwLock::clear_poison
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Кто работал над 1.77.0
Многие люди собрались вместе, чтобы создать Rust 1.77.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели TelegaOvoshey и funkill.