01 июня 2023 · Команда по выпуску Rust
Команда Rust рада анонсировать новую версию Rust, 1.70.0. Rust - это язык программирования, позволяющий каждому создавать надежное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust через rustup, вы можете получить 1.70.0:
rustup update stable
Если у вас его еще нет, вы можете получить rustup
с соответствующей страницы на нашем веб-сайте и ознакомиться с подробными примечаниями к выпуску 1.70.0 на GitHub.
Если вы хотите помочь нам, протестировав будущие версии, вы можете рассмотреть возможность локального обновления, чтобы использовать бета-канал (rustup default beta) или ночной канал (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
, размещенного в GitHub, для изменения значения по умолчанию можно использовать параметр конфигурации registries.crates-io.protocol
.
Один побочный эффект при изменении метода доступа заключается в том, что это также изменяет путь к кэшу крейта, поэтому зависимости будут загружены заново. Как только вы полностью обязались использовать sparse
протокол, вы можете очистить старые пути $CARGO_HOME/registry/*/github.com-*
.
OnureCell и OnureLock
Два новых типа были стабилизированы для одноразовой инициализации общих данных: 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} wins!");
}
Такие крейты, как lazy_static
и once_cell
, удовлетворяли эту потребность в прошлом, но теперь эти компоновочные блоки являются частью стандартной библиотеки, перенесенной из модулей рассинхронизации и синхронизации once_cell
. Есть еще больше методов, которые могут быть стабилизированы в будущем, а также сопутствующие типы LazyCell
и LazyLock
, которые хранят свою инициализирующую функцию, но этот первый шаг в стабилизации уже должен охватывать многие варианты использования.
IsTerminal
Этот недавно стабилизированный трейт имеет единственный метод, is_terminal
, чтобы определить, представляет ли данный дескриптор или дескриптор файла терминал или TTY
. Это еще один случай стандартизации функциональности, которая существовала во внешних пакетах, таких как atty
и is-terminal
, с использованием функции isatty
библиотеки C
в целях 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 имеет ряд опций, в том числе некоторые, которые еще не стабилизированы и требуют указания -Zunstable-options
, как и многие другие команды в цепочке инструментов Rust. Однако, хотя это предназначено только для ночных сборок, это ограничение не было активным в тестировании - до сих пор. Начиная с версии 1.70.0, стабильные и бета-сборки Rust больше не будут допускать нестабильные варианты тестирования, что делает их действительно только для ночных, как задокументировано.
Известны случаи, когда нестабильные опции могли использоваться без прямых знаний пользователя, особенно --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. Мы не смогли бы сделать это без всех вас. Спасибо!