Команда Rust рада сообщить о выпуске новой версии 1.53.0. Rust это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами
rustup
, то для обновления до версии 1.53.0 вам
достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете
установить его с соответствующей страницы нашего веб-сайта, а также
посмотреть подробные примечания к
выпуску на GitHub.
Что было стабилизировано в 1.53.0
Этот выпуск содержит несколько новых возможностей языка и ещё
больше стандартной библиотеки, включая долгожданную реализацию
IntoIterator
для массивов. Смотрите подробные примечания к
выпуску, чтобы узнать о других изменениях, не представленных в
данном анонсе.
IntoIterator
для
массивов
Это первый выпуск Rust, в котором массивы реализуют типаж
IntoIterator
. Теперь вы можете итерироваться в массиве
по значению:
for i in [1, 2, 3] { ..}
Раньше это было возможно только по ссылке, с помощью
&[1, 2, 3]
или [1, 2, 3].iter()
.
Аналогично вы теперь можете передать массив в методы, ожидающие
T: IntoIterator
:
let set = BTreeSet::from_iter([1, 2, 3]);
for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { ..}
Это не было реализовано ранее из-за проблем с совместимостью.
IntoIterator
всегда реализуется для ссылок на массивы
и в предыдущих выпусках array.into_iter()
компилировался, преобразовываясь в
(&array).into_iter()
.
Начиная с этого выпуска, массивы реализуют
IntoIterator
с небольшими оговорками для устранения
несовместимости кода. Компилятор, как и прежде, преобразовывает
array.into_iter()
в
(&array).into_iter()
, как если бы реализации
типажа ещё не было. Это касается только синтаксиса вызова метода
.into_iter()
и не затрагивает, например, for e
in [1, 2, 3]
, iter.zip([1, 2, 3])
или
IntoIterator::into_iter([1, 2, 3])
, которые прекрасно
компилируются.
Так как особый случай .into_iter()
необходим только
для предотвращения поломки существующего кода, он будет удалён в
новой редакции Rust 2021, которая выйдет позже в этом году. Если
хотите узнать больше следите за анонсами редакции.
"Или" в шаблонах
Синтаксис шаблонов был расширен поддержкой |
,
вложенного в шаблон где угодно. Это позволяет писать Some(1 |
2)
вместо Some(1) | Some(2)
.
match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. }}
Unicode-идентификаторы
Теперь идентификаторы могут содержать не-ASCII символы. Можно использовать все действительные идентификаторы символов Unicode, определённые в UAX #31. Туда включены символы из многих разных языков и письменностей но не эмодзи.
Например:
const BLHAJ: &str = "";struct { : String,}let = 1;
Компилятор предупредит о потенциальной путанице с участием разных символов. Например, при использовании идентификаторов, которые выглядят очень похоже, мы получим предупреждение:
warning: identifier pair considered confusable between `` and `s`
Поддержка имени HEAD-ветки в Cargo
Cargo больше не предполагает, что HEAD
-ветка в
git-репозитории называется master
. А следовательно,
вам не надо указывать branch = "main"
для зависимостей
из git-репозиториев, в которых ветка по умолчанию
main
.
Инкрементальная компиляция до сих пор отключена по умолчанию
Как ранее говорилось в анонсе 1.52.1, инкрементальная компиляция была отключена для стабильных выпусков Rust. Функциональность остаётся доступной в каналах beta и nightly. Метод включения инкрементальной компиляции в 1.53.0 не изменился с 1.52.1.
Стабилизированные API
Следующие методы и реализации типажей были стабилизированы:
array::from_ref
array::from_mut
AtomicBool::fetch_update
AtomicPtr::fetch_update
BTreeSet::retain
BTreeMap::retain
BufReader::seek_relative
cmp::min_by
cmp::min_by_key
cmp::max_by
cmp::max_by_key
DebugStruct::finish_non_exhaustive
Duration::ZERO
Duration::MAX
Duration::is_zero
Duration::saturating_add
Duration::saturating_sub
Duration::saturating_mul
f32::is_subnormal
f64::is_subnormal
IntoIterator for array
{integer}::BITS
io::Error::Unsupported
NonZero*::leading_zeros
NonZero*::trailing_zeros
Option::insert
Ordering::is_eq
Ordering::is_ne
Ordering::is_lt
Ordering::is_gt
Ordering::is_le
Ordering::is_ge
OsStr::make_ascii_lowercase
OsStr::make_ascii_uppercase
OsStr::to_ascii_lowercase
OsStr::to_ascii_uppercase
OsStr::is_ascii
OsStr::eq_ignore_ascii_case
Peekable::peek_mut
Rc::increment_strong_count
Rc::decrement_strong_count
slice::IterMut::as_slice
AsRef<[T]> for slice::IterMut
impl SliceIndex for (Bound<usize>, Bound<usize>)
Vec::extend_from_within
Другие изменения
Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.
Участники 1.53.0
Множество людей собрались вместе, чтобы создать Rust 1.53.0. Мы не смогли бы сделать это без всех вас. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или
же в аналогичном чате для новичковых вопросов.
Если у вас есть вопросы по переводам или хотите помогать с ними, то
обращайтесь в чат переводчиков.
Также можете поддержать нас на OpenCollective.
Данную статью совместными усилиями перевели TelegaOvoshey, blandger, Belanchuk и funkill.