Команда 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.
Комментарии (19)
quaer
02.06.2023 17:23На чём писать и отлаживать на нём можно нормально? Отладчик LLDB в VS Code валится на коде из 4-х строчек.
AnthonyMikh
02.06.2023 17:23+4Если вам для написания программ на Rust нужен отладчик, то вы пишете на нём неправильно /s
slonopotamus
02.06.2023 17:23Использую Clion, доволен.
quaer
02.06.2023 17:23Он же платный, неохота покупать, пока нет задачи на нём профессионально писать. А в IntellliJ отладчика нет.
slonopotamus
02.06.2023 17:23Jetbrains раздают бесплатные лицензии на свои продукты разработчикам открытого софта. Но вообще - вы спросили в чём нормально работать, я ответил.
JustForFun88
02.06.2023 17:23Это действительно странно. Пару раз использовал отладчик чтобы понять где логическая ошибка и еще ни разу ничего не валилось.
Siddthartha
все хорошо, но, как оказалось, сбилдить статически что-либо с зависимостями не так-то просто.
alex-open-plc
Ещё более "не так то просто" собрать zero-time приложение. То, что используется в микроконтроллерах...
Не пробовал, но с трудом представляю, как на "ржавом" писать драйвера для линукс...
lain8dono
zero-time это без core? Для чего и зачем?
Для ATiny или чего-то такого лучше уж сразу на ассемблере писать. Да и более жирные AVR - скорее игрушки для мазохистов (даже не как что-то плохое). Для адекватных микроконтроллеров без core что-то адекватное писать смысла нет. В некотором смысле core изначально рассчитана на подобное использование.
Вообще embedded предполагает некоторые дополнительные знания касательно инструментов. Как минимум нужно иметь специальный тулчейн для таргета и понимание процесса сборки бинарника. И в этом смысле rust ничем не отличается от других языков.
На сколько я знаю, единственный серьезный проблемный момент - нет простого способа писать panic-free код на rust.
Siddthartha
а необходимость статического билда несерьезный момент?) заметили, что когда человек спрашивает как сделать что-либо и люди не знают -- они начинают рассказывать что ему это не нужно?) это же как в анекдоте "доктор, когда я делаю так мне больно -- не делайте так"
я вот хочу статический билд с использованием tch-rs -- пока "нивкакую"
lain8dono
А это точно проблема Rust? Выглядит как проблема конкретной либы. Возможно стоит прочитать README или типа того. Ну или спросить этих торчков-наркоманов, что они там намудрили.
Gorthauer87
В каком смысле статический билд? Под контроллер же by design собирается именно статический бинарник.
lain8dono
На самом деле нет. Просто обычно вы не очень хотите делать свой собственный линковщик с нуля.
tzlom
это буквально биндинг libtorch, как вы его себе статическим представляете?
Gorthauer87
Так если собрать саму libtorch статически, то и все будет статикой. Это все не проблема раста, это как раз вопросы к скриптам сборки tch-rs, просто спросите и них.
redfox0
https://github.com/LaurentMazare/tch-rs#static-linking
serginho
https://docs.rust-embedded.org/embedonomicon/smallest-no-std.html