- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о выпуске новой версии — 1.53.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.53.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску [1] на GitHub.
Этот выпуск содержит несколько новых возможностей языка и ещё больше — стандартной библиотеки, включая долгожданную реализацию IntoIterator для массивов. Смотрите подробные примечания к выпуску [1], чтобы узнать о других изменениях, не представленных в данном анонсе.
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, которая выйдет позже в этом году. Если хотите узнать больше — следите за анонсами редакции [2].
Синтаксис шаблонов был расширен поддержкой |, вложенного в шаблон где угодно. Это позволяет писать Some(1 | 2) вместо Some(1) | Some(2).
match result {
Ok(Some(1 | 2)) => { .. }
Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
_ => { .. }
}
Теперь идентификаторы могут содержать не-ASCII символы. Можно использовать все действительные идентификаторы символов Unicode, определённые в UAX #31 [3]. Туда включены символы из многих разных языков и письменностей — но не эмодзи.
Например:
const BLÅHAJ: &str = "";
struct 人 {
名字: String,
}
let α = 1;
Компилятор предупредит о потенциальной путанице с участием разных символов. Например, при использовании идентификаторов, которые выглядят очень похоже, мы получим предупреждение:
warning: identifier pair considered confusable between `s` and `s`
Cargo больше не предполагает, что HEAD-ветка в git-репозитории называется master. А следовательно, вам не надо указывать branch = "main" для зависимостей из git-репозиториев, в которых ветка по умолчанию main.
Как ранее говорилось в анонсе 1.52.1 [4], инкрементальная компиляция была отключена для стабильных выпусков Rust. Функциональность остаётся доступной в каналах beta и nightly. Метод включения инкрементальной компиляции в 1.53.0 не изменился с 1.52.1.
Следующие методы и реализации типажей были стабилизированы:
array::from_ref [5]array::from_mut [6]AtomicBool::fetch_update [7]AtomicPtr::fetch_update [8]BTreeSet::retain [9]BTreeMap::retain [10]BufReader::seek_relative [11]cmp::min_by [12]cmp::min_by_key [13]cmp::max_by [14]cmp::max_by_key [15]DebugStruct::finish_non_exhaustive [16]Duration::ZERO [17]Duration::MAX [18]Duration::is_zero [19]Duration::saturating_add [20]Duration::saturating_sub [21]Duration::saturating_mul [22]f32::is_subnormal [23]f64::is_subnormal [24]IntoIterator for array [25]{integer}::BITS [26]io::Error::Unsupported [27]NonZero*::leading_zeros [28]NonZero*::trailing_zeros [29]Option::insert [30]Ordering::is_eq [31]Ordering::is_ne [32]Ordering::is_lt [33]Ordering::is_gt [34]Ordering::is_le [35]Ordering::is_ge [36]OsStr::make_ascii_lowercase [37]OsStr::make_ascii_uppercase [38]OsStr::to_ascii_lowercase [39]OsStr::to_ascii_uppercase [40]OsStr::is_ascii [41]OsStr::eq_ignore_ascii_case [42]Peekable::peek_mut [43]Rc::increment_strong_count [44]Rc::decrement_strong_count [45]slice::IterMut::as_slice [46]AsRef<[T]> for slice::IterMut [47]impl SliceIndex for (Bound<usize>, Bound<usize>) [48]Vec::extend_from_within [49]Синтаксис [1], пакетный менеджер Cargo [50] и анализатор Clippy [51] также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать Rust 1.53.0. Мы не смогли бы сделать это без всех вас. Спасибо [52]!
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [53] или же в аналогичном чате для новичковых вопросов [54]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [55].
Также можете поддержать нас на OpenCollective [56].
Данную статью совместными усилиями перевели TelegaOvoshey [57], blandger [58], Belanchuk [59] и funkill [60].
Автор: RustLangRu
Источник [61]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/365355
Ссылки в тексте:
[1] подробные примечания к выпуску: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1530-2021-06-17
[2] анонсами редакции: https://blog.rust-lang.org/2021/05/11/edition-2021.html#intoiterator-for-arrays
[3] UAX #31: https://unicode.org/reports/tr31/
[4] в анонсе 1.52.1: https://blog.rust-lang.org/2021/05/10/Rust-1.52.1.html
[5] array::from_ref: https://doc.rust-lang.org/stable/std/array/fn.from_ref.html
[6] array::from_mut: https://doc.rust-lang.org/stable/std/array/fn.from_mut.html
[7] AtomicBool::fetch_update: https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.fetch_update
[8] AtomicPtr::fetch_update: https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.fetch_update
[9] BTreeSet::retain: https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html#method.retain
[10] BTreeMap::retain: https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html#method.retain
[11] BufReader::seek_relative: https://doc.rust-lang.org/stable/std/io/struct.BufReader.html#method.seek_relative
[12] cmp::min_by: https://doc.rust-lang.org/stable/std/cmp/fn.min_by.html
[13] cmp::min_by_key: https://doc.rust-lang.org/stable/std/cmp/fn.min_by_key.html
[14] cmp::max_by: https://doc.rust-lang.org/stable/std/cmp/fn.max_by.html
[15] cmp::max_by_key: https://doc.rust-lang.org/stable/std/cmp/fn.max_by_key.html
[16] DebugStruct::finish_non_exhaustive: https://doc.rust-lang.org/stable/std/fmt/struct.DebugStruct.html#method.finish_non_exhaustive
[17] Duration::ZERO: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#associatedconstant.ZERO
[18] Duration::MAX: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#associatedconstant.MAX
[19] Duration::is_zero: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.is_zero
[20] Duration::saturating_add: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_add
[21] Duration::saturating_sub: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_sub
[22] Duration::saturating_mul: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_mul
[23] f32::is_subnormal: https://doc.rust-lang.org/stable/std/primitive.f32.html#method.is_subnormal
[24] f64::is_subnormal: https://doc.rust-lang.org/stable/std/primitive.f64.html#method.is_subnormal
[25] IntoIterator for array: https://doc.rust-lang.org/stable/std/primitive.array.html#impl-IntoIterator
[26] {integer}::BITS: https://doc.rust-lang.org/stable/std/primitive.usize.html#associatedconstant.BITS
[27] io::Error::Unsupported: https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.Unsupported
[28] NonZero*::leading_zeros: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU32.html#method.leading_zeros
[29] NonZero*::trailing_zeros: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU32.html#method.trailing_zeros
[30] Option::insert: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.insert
[31] Ordering::is_eq: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_eq
[32] Ordering::is_ne: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_ne
[33] Ordering::is_lt: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_lt
[34] Ordering::is_gt: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_gt
[35] Ordering::is_le: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_le
[36] Ordering::is_ge: https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html#method.is_ge
[37] OsStr::make_ascii_lowercase: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.make_ascii_lowercase
[38] OsStr::make_ascii_uppercase: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.make_ascii_uppercase
[39] OsStr::to_ascii_lowercase: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.to_ascii_lowercase
[40] OsStr::to_ascii_uppercase: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.to_ascii_uppercase
[41] OsStr::is_ascii: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.is_ascii
[42] OsStr::eq_ignore_ascii_case: https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.eq_ignore_ascii_case
[43] Peekable::peek_mut: https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.peek_mut
[44] Rc::increment_strong_count: https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.increment_strong_count
[45] Rc::decrement_strong_count: https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.decrement_strong_count
[46] slice::IterMut::as_slice: https://doc.rust-lang.org/stable/std/slice/struct.IterMut.html#method.as_slice
[47] AsRef<[T]> for slice::IterMut: https://doc.rust-lang.org/stable/std/slice/struct.IterMut.html#impl-AsRef%3C%5BT%5D%3E
[48] impl SliceIndex for (Bound<usize>, Bound<usize>): https://doc.rust-lang.org/stable/std/primitive.tuple.html#impl-SliceIndex%3C%5BT%5D%3E
[49] Vec::extend_from_within: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.extend_from_within
[50] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-153-2021-06-17
[51] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-153
[52] Спасибо: https://thanks.rust-lang.org/rust/1.53.0/
[53] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[54] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[55] чат переводчиков: https://t.me/rustlang_ru_translations
[56] OpenCollective: https://opencollective.com/rust-lang-ru
[57] TelegaOvoshey: https://habr.com/ru/users/telegaovoshey/
[58] blandger: https://habr.com/ru/users/blandger/
[59] Belanchuk: https://habr.com/ru/users/belanchuk/
[60] funkill: https://habr.com/ru/users/funkill/
[61] Источник: https://habr.com/ru/post/563548/?utm_source=habrahabr&utm_medium=rss&utm_campaign=563548
Нажмите здесь для печати.