Команда Rust рада сообщить о новой версии языка — 1.70.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.70.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Что стабилизировано в 1.70.0
Протокол 'sparse' по умолчанию для crates.io
Протокол 'sparse' Cargo теперь включён по умолчанию для чтения индекса из crates.io. Ранее эта функция была стабилизирована в Rust 1.68.0, но для её использования с crates.io по прежнему требовалась настройка. Мы обещали, что это поведение будет использоваться по умолчанию в версии 1.70.0 — и вот оно!
Вы увидите существенное повышение производительности при извлечении информации из индекса crates.io. Пользователям, ограниченным фаерволом, необходимо будет убедиться, что https://index.crates.io
доступен. Если по какой-либо причине вам нужно сохранить предыдущие настройки по умолчанию с использованием git-индекса c GitHub, вы можете использовать параметр конфигурации registries.crates-io.protocol
для изменения используемого протокола.
Побочный эффект изменения метода доступа в том, что изменяется также и путь к кэшу пакетов — и все зависимости загружаются заново. Как только вы полностью перейдёте к использованию протокола 'sparse', вы сможете удалить старый кэш $CARGO_HOME/registry/*/github.com-*
.
OnceCell
и OnceLock
Два новых типа были стабилизированы для единовременной инициализации совместно используемых данных: OnceCell
и его потокобезопасный аналог OnceLock
. Они могут быть использованы везде, где немедленное создание нежелательно или даже невозможно, например, не-const
данные в глобальных переменных.
use std::sync::OnceLock;
static WINNER: OnceLock<&str> = OnceLock::new();
fn main() {
let winner = std::thread::scope(|s| {
s.spawn(|| WINNER.set("thread"));
std::thread::yield_now(); // дайте им шанс...
WINNER.get_or_init(|| "main")
});
println!("{winner} победил!");
}
Такие пакеты, как lazy_static
и once_cell
, в прошлом удовлетворяли эту потребность, но теперь они являются частью стандартной библиотеки, перенесённой из once_cell
в модули unsync
и sync
. Есть ещё методы, которые могут быть стабилизированы в будущем, а также сопутствующие типы LazyCell
и LazyLock
, которые сохраняют свою инициализирующую функцию, но этот первый шаг в стабилизации уже должен охватывать множество вариантов использования.
IsTerminal
Этот недавно стабилизированный трейт имеет единственный метод is_terminal
для определения того, является ли реализация файловым дескриптором или же дескриптором терминала или TTY. Это ещё один случай стандартизации функционала, существовавшего во внешних пакетах, например atty
и is-terminal
, использующих функции библиотеки C isatty
в целевых системах Unix, а также в других местах. Этот функционал часто используется в программах, которые должны различать, где проходит запуск — в скриптах или интерактивных режимах, например для представления цветов или даже полного TUI в интерактивном режиме.
use std::io::{stdout, IsTerminal};
fn main() {
let use_color = stdout().is_terminal();
// если так, добавляем коды цветов в вывод приложения...
}
Именованные ярлыки отладочной информации
Опция компилятора -Cdebuginfo
ранее поддерживала только числа 0..=2 для увеличения объёма отладочной информации, где Cargo по умолчанию использовал 2 в профилях dev
и test
и 0 в профилях release
и bench
. Эти уровни отладки теперь имеют имена «none» (0), «limited» (1) и «full» (2). Также появилось два новых уровня: «line-directives-only» и «line-tables-only».
Документация Cargo и rustc ранее называла уровень 1 «line tables only», но не содержала информации о типах и переменных — только информацию обо всех функциях. Этот уровень теперь называется «limited», а новый уровень «line-tables-only» усечён до минимума, необходимого для обратных трассировок с именами файлов и номерами строк. В конечном итоге это может стать уровнем, используемым для -Cdebuginfo=1
. Другой уровень line-directives-only
предназначен для профилирования NVPTX и не рекомендуется для использования в других случаях.
Обратите внимание, что именованные опции недоступны для использования в Cargo.toml
. Их поддержка запланирована на следующий выпуск, 1.71.
Принудительная стабилизация в test
CLI
Когда функции #[test]
скомпилированы, исполняемый файл получает интерфейс командной строки из пакета test
. Этот CLI имеет несколько опций, включая ещё нестабильные и требующие указания -Zunstable-options
(как и многие другие команды в наборе инструментов Rust). Однако хоть и предполагается, что использование этой опции разрешено только в ночных сборках, это ограничение до сих пор не было активным в test
. Начиная с версии 1.70.0, stable и beta-версии Rust больше не будут позволять использовать нестабильные параметры при запуске тестов, что приводит эти опции в соответствие с документацией и делает их возможными только в nightly-сборках.
Известны случаи, когда нестабильные параметры могли использоваться без ведома пользователя, особенно --format json
, используемый в IntelliJ Rust и других плагинах IDE. Эти проекты уже приспосабливаются к этому изменению, и за статусом вывода JSON можно следить в соответствующей задаче.
Стабилизированные API
NonZero*::MIN/MAX
BinaryHeap::retain
Default for std::collections::binary_heap::IntoIter
Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
Default for std::collections::btree_map::{IntoKeys, Keys}
Default for std::collections::btree_map::{IntoValues, Values}
Default for std::collections::btree_map::Range
Default for std::collections::btree_set::{IntoIter, Iter}
Default for std::collections::btree_set::Range
Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
Default for std::vec::IntoIter
Default for std::iter::Chain
Default for std::iter::Cloned
Default for std::iter::Copied
Default for std::iter::Enumerate
Default for std::iter::Flatten
Default for std::iter::Fuse
Default for std::iter::Rev
Default for std::slice::Iter
Default for std::slice::IterMut
Rc::into_inner
Arc::into_inner
std::cell::OnceCell
Option::is_some_and
NonNull::slice_from_raw_parts
Result::is_ok_and
Result::is_err_and
std::sync::atomic::Atomic*::as_ptr
std::io::IsTerminal
std::os::linux::net::SocketAddrExt
std::os::unix::net::UnixDatagram::bind_addr
std::os::unix::net::UnixDatagram::connect_addr
std::os::unix::net::UnixDatagram::send_to_addr
std::os::unix::net::UnixListener::bind_addr
std::path::Path::as_mut_os_str
std::sync::OnceLock
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Участники 1.70.0
Многие люди собрались вместе, чтобы создать Rust 1.70.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели TelegaOvoshey, kunansy, andreevlex и funkill.