Команда 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 BLÅHAJ: &str = "";
struct 人 {
名字: String,
}
let α = 1;Компилятор предупредит о потенциальной путанице с участием разных символов. Например, при использовании идентификаторов, которые выглядят очень похоже, мы получим предупреждение:
warning: identifier pair considered confusable between `s` 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_refarray::from_mutAtomicBool::fetch_updateAtomicPtr::fetch_updateBTreeSet::retainBTreeMap::retainBufReader::seek_relativecmp::min_bycmp::min_by_keycmp::max_bycmp::max_by_keyDebugStruct::finish_non_exhaustiveDuration::ZERODuration::MAXDuration::is_zeroDuration::saturating_addDuration::saturating_subDuration::saturating_mulf32::is_subnormalf64::is_subnormalIntoIterator for array{integer}::BITSio::Error::UnsupportedNonZero*::leading_zerosNonZero*::trailing_zerosOption::insertOrdering::is_eqOrdering::is_neOrdering::is_ltOrdering::is_gtOrdering::is_leOrdering::is_geOsStr::make_ascii_lowercaseOsStr::make_ascii_uppercaseOsStr::to_ascii_lowercaseOsStr::to_ascii_uppercaseOsStr::is_asciiOsStr::eq_ignore_ascii_casePeekable::peek_mutRc::increment_strong_countRc::decrement_strong_countslice::IterMut::as_sliceAsRef<[T]> for slice::IterMutimpl 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.