Команда Rust рада представить новую версию языка — 1.58.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.58.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.58.0 на GitHub.
Что стабилизировано в 1.58.0
В Rust 1.58 появились захваченные идентификаторы в форматируемых строках, изменился путь поиска в Windows для Command, в стандартной библиотеке стало больше аннотаций #[must_use], а также были стабилизированы некоторые функции.
Захваченные идентификаторы в форматируемых строках
Форматируемые строки теперь могут захватывать аргументы, если вы просто напишете {ident} в строке. Форматируемые строки уже давно принимают позиционные аргументы (возможно, по индексу) и именованные аргументы. Например:
println!("Hello, {}!", get_person()); // implicit position println!("Hello, {0}!", get_person()); // explicit index println!("Hello, {person}!", person = get_person()); // named
Сейчас именованные аргументы также могут быть захвачены из окружения, например:
let person = get_person(); // ... println!("Hello, {person}!"); // captures the local `person`
Это также может использоваться в параметрах форматирования:
let (width, precision) = get_format(); for (name, score) in get_scores() { println!("{name}: {score:width$.precision$}"); }
Форматируемые строки могут захватывать только простые идентификаторы, но не произвольные пути или выражения. Для более сложных аргументов либо сначала присвойте им локальное имя, либо используйте старый стиль форматирования аргументов name = expression.
Эта функция работает во всех макросах, принимающих форматируемые строки. Тем не менее, существует один крайний случай — работа макроса panic! в выпусках 2015 и 2018, где panic!("{ident}") по-прежнему обрабатывается как обычная строка. Компилятор предупредит об этом, но ожидаемого эффекта не произойдёт. Благодаря обновлению макроса паники в выпуске 2021 года для улучшения согласованности в panic! это будет работать ровно так, как и ожидалось.
Сокращение пути поиска для Command на Windows
На Windows std::process::Command больше не ищет исполняемые файлы в текущей директории. Этот эффект был связан с поведением win32 API CreateProcess, из-за чего поиск осуществлялся в следующем порядке:
- (Специфично для Rust) Директории перечисленные в переменной окружения
PATHдочернего процесса, если эта переменная явно изменялась родительским процессом. - Директория, из которой было загружено приложение
- Текущая директория для родительского процесса
- Системная директория 32-битной Windows
- Системная директория 16-битной Windows
- Директория Windows
- Директории, указанные в переменной окружения
PATH
Однако использование текущего каталога может привести к неожиданным результатам или даже опасному поведению при работе с ненадёжными директориями. Например, ripgrep опубликовали CVE-2021-3013 ко��да узнали, что их дочерние процессы могут быть перехвачены таким образом. Даже собственные документы PowerShell Microsoft не используют текущую директорию ради безопасности.
Теперь Rust осуществляет свой поиск без учёта текущей директории и старой 16-битной директории, так как нет API, чтобы найти её расположение. Так что новый порядок поиска для Command на Windows таков:
- Директории, указанные в дочерней переменной окружения
PATH - Директория, из которой было загружено приложение
- Системная директория 32-битной Windows
- Директория Windows
- Директории, указанные в переменной окружения
PATH
Не ориентированные на Windows приложения продолжат использовать прежнее специфическое для платформы поведение, чаще всего учитывая только дочернюю или родительскую переменную окружения PATH.
Больше атрибутов #[must_use] в стандартной библиотеке
Атрибут #[must_use] применяется к типам и функциям, у которых отсутствие явной обработки или результата считается ошибкой. Это давно используется в стандартной библиотеке для типов, подобных Result, которые должны быть проверены на наличие ошибок. Атрибут также помогает отловить ошибки ожидания изменения функцией передаваемого значения, в то время как она возвращает новое значение.
Библиотечное предложение №35 было одобрено для проверки в октябре 2021 года и расширяет применение #[must_use] в стандартной библиотеке. Оно покрывает больше функций, основной эффект которых — возвращение значения. Похоже на идею чистоты функций, но более слабо, чем настоящая языковая черта. Часть функций была представлена в 1.57.0 — теперь же добавлена оставшаяся часть.
Стабилизированные API
Стабилизированы следующие методы и реализации трейтов:
Metadata::is_symlinkPath::is_symlink{integer}::saturating_divOption::unwrap_uncheckedResult::unwrap_uncheckedResult::unwrap_err_uncheckedFile::options
Следующие ранее стабилизированные API стали const:
Duration::newDuration::checked_addDuration::saturating_addDuration::checked_subDuration::saturating_subDuration::checked_mulDuration::saturating_mulDuration::checked_div
Прочие изменения
В синтаксис, пакетный менеджер Cargo и анализатор Clippy также внесены некоторые изменения.
Участники 1.58.0
Множество людей объединились для создания Rust 1.58.0. Мы не смогли бы сделать это без всех вас. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков. Также можете поддержать нас на OpenCollective.
Данную статью совместными усилиями перевели belanchuk, andreevlex, SomeAkk, TelegaOvoshey, torgeek, olafars и funkill.