- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о новой версии языка — 1.56.0. С этим выпуском также стабилизируется 2021 редакция. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.56.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску [2] на GitHub.
В мае [3] мы писали о планах по выпуску редакции Rust 2021. Редакция — это механизм добавления изменений, которые могут нарушить обратную совместимость. О том, как это происходит, можно узнать в руководстве по редакциям [4]. Эта редакция — небольшая, особенно по сравнению с 2018, однако в ней присутствует ещё несколько облегчающих жизнь изменений. Они требуют подтверждения обновления, чтобы избежать поломки в некоторых особых случаях в уже написанном коде. Для получения более подробной информации о новом функционале и о том, как произвести миграцию, предлагаем вам самим ознакомиться с новыми главами редакции:
IntoIterator для массивов [6]: array.into_iter() теперь итерирует элементы по значению, а не по ссылке.A|B теперь — как и в $_:pat_param — соответствуют верхнему уровню в $:pat .TryInto, TryFrom и FromIterator.println!().ident#, ident"..." и ident'...'.bare_trait_objects и ellipsis_inclusive_range_patterns.Замыкания автоматически захватывают значения или ссылки на идентификаторы, которые используются в теле замыкания, но до 2021 редакции они захватывали их всегда целиком. Новая функция непересекающегося захвата может существенно упростить написание замыканий, поэтому давайте посмотрим на небольшой пример:
// Код в 2015 или 2018 редакции
let a = SomeStruct::new();
// Убираем одно из полей структуры
drop(a.x);
// Ok: Используем другое поле структуры
println!("{}", a.y);
// Ошибка: До 2021 редакции потребуется полностью захватить `a`
let c = || println!("{}", a.y);
c();
Чтобы исправить это, вам пришлось бы извлечь что-то вроде let y = &a.y; вручную перед закрытием, чтобы ограничить его захват. Начиная с Rust 2021 замыкания будут автоматически захватывать только те поля, которые они используют, поэтому приведённый выше пример будет компилироваться нормально!
Это поведение активируется только в новой редакции, поскольку оно может изменить порядок, в котором удаляются поля. Что касается всех изменений редакций, то для них доступна автоматическая миграция — она обновит ваши замыкания, для которых это важно. Внутрь замыкания будет вставлено let _ = &a;, чтобы захватить всю структуру, как раньше.
Руководство включает инструкции по миграции для всех новых функций и в целом по переходу существующего проекта на новую версию. [13] Во многих случаях cargo fix может автоматизировать необходимые изменения. Вы даже можете обнаружить, что для версии 2021 никаких изменений в вашем коде не нужно!
Каким бы маленьким ни казалось это издание на первый взгляд, оно по-прежнему является результатом кропотливой работы многих участников, которых вы можете найти в отдельном трекере Rust 2021 celebration and thanks [14]!
rust-versionCargo.toml теперь поддерживает поле [package] rust-version [15], которое используется, чтобы указать минимальную поддерживаемую версию Rust для крейта. Cargo завершит работу с ранней ошибкой, если условие не выполнится. В настоящее время это не влияет на преобразователь зависимостей, но вся идея в том, чтобы выявить проблемы совместимости прежде, чем они превратятся в загадочные ошибки компилятора.
binding @ patternСопоставление с шаблоном в Rust можно записать с помощью одного идентификатора, который связывает все значение. За ним следует @ и более точный структурный шаблон, однако это не позволяло делать дополнительных привязок в этом шаблоне — до сих пор!
struct Matrix {
data: Vec<f64>,
row_len: usize,
}
// Раньше нам было необходимо разделить присваивание
// всей структуры и чтение её частей.
let matrix = get_matrix();
let row_len = matrix.row_len;
// или с помощью деструктурирования:
let Matrix { row_len, .. } = matrix;
// С Rust 1.56 можно сделать это в одно действие!
let matrix @ Matrix { row_len, .. } = get_matrix();
На самом деле это было возможно до появления Rust 1.0, но было удалено из-за известной на то время несостоятельности. [16] С развитием инструментария проверки заимствований, через долгие и интенсивные тесты компилятора команда определила, что это, все-таки, безопасно, и включила эту возможность в Rust!
Стабилизированы следующие методы и реализации трейтов:
std::os::unix::fs::chroot [17]UnsafeCell::raw_get [18]BufWriter::into_parts [19]core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe} [20] (ранее было только в std)Vec::shrink_to [21]String::shrink_to [22]OsString::shrink_to [23]PathBuf::shrink_to [24]BinaryHeap::shrink_to [25]VecDeque::shrink_to [26]HashMap::shrink_to [27]HashSet::shrink_to [28]Следующие ранее стабилизированные API стали const:
std::mem::transmute [29]Синтаксис [2], пакетный менеджер Cargo [30] и анализатор Clippy [31] также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать Rust 1.56.0 и 2021 редакцию. Мы не смогли бы сделать это без всех вас. Спасибо! [32]
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [33] или же в аналогичном чате для новичковых вопросов [34]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [35]. Также можете поддержать нас на OpenCollective [36].
Данную статью совместными усилиями перевели funkill [37], TelegaOvoshey [38], belanchuk [39] и SomeAkk.
Автор:
RustLangRu
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/369027
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/install.html
[2] подробные примечания к выпуску: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1560-2021-10-21
[3] мае: https://blog.rust-lang.org/2021/05/11/edition-2021.html
[4] руководстве по редакциям: https://doc.rust-lang.org/stable/edition-guide/editions/index.html
[5] Непересекающийся захват в замыканиях: https://doc.rust-lang.org/edition-guide/rust-2021/disjoint-capture-in-closures.html
[6] IntoIterator для массивов: https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html
[7] Или-шаблоны в макроправилах: https://doc.rust-lang.org/edition-guide/rust-2021/or-patterns-macro-rules.html
[8] Теперь в Cargo по умолчанию: https://doc.rust-lang.org/edition-guide/rust-2021/default-cargo-resolver.html
[9] Добавлено в прелюдию: https://doc.rust-lang.org/edition-guide/rust-2021/prelude.html
[10] Макрос panic: https://doc.rust-lang.org/edition-guide/rust-2021/panic-macro-consistency.html
[11] Зарезервирован синтаксис: https://doc.rust-lang.org/edition-guide/rust-2021/reserving-syntax.html
[12] Следующие предупреждения стали ошибками: https://doc.rust-lang.org/edition-guide/rust-2021/warnings-promoted-to-error.html
[13] переходу существующего проекта на новую версию.: https://doc.rust-lang.org/edition-guide/editions/transitioning-an-existing-project-to-a-new-edition.html
[14] Rust 2021 celebration and thanks: https://github.com/rust-lang/rust/issues/88623
[15] rust-version: https://doc.rust-lang.org/cargo/reference/manifest.html#the-rust-version-field
[16] несостоятельности.: https://github.com/rust-lang/rust/pull/16053
[17] std::os::unix::fs::chroot: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html
[18] UnsafeCell::raw_get: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get
[19] BufWriter::into_parts: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
[20] core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}: https://github.com/rust-lang/rust/pull/84662
[21] Vec::shrink_to: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to
[22] String::shrink_to: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to
[23] OsString::shrink_to: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to
[24] PathBuf::shrink_to: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to
[25] BinaryHeap::shrink_to: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to
[26] VecDeque::shrink_to: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to
[27] HashMap::shrink_to: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to
[28] HashSet::shrink_to: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to
[29] std::mem::transmute: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html
[30] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-156-2021-10-21
[31] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-156
[32] Спасибо!: https://thanks.rust-lang.org/rust/1.56.0/
[33] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[34] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[35] чат переводчиков: https://t.me/rustlang_ru_translations
[36] OpenCollective: https://opencollective.com/rust-lang-ru
[37] funkill: https://habr.com/ru/users/funkill/
[38] TelegaOvoshey: https://habr.com/ru/users/telegaovoshey/
[39] belanchuk: https://habr.com/ru/users/belanchuk/
[40] Источник: https://habr.com/ru/post/585052/?utm_source=habrahabr&utm_medium=rss&utm_campaign=585052
Нажмите здесь для печати.