Команда Rust рада сообщить о новой версии языка — 1.56.0. С этим выпуском также стабилизируется 2021 редакция. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup
, то для обновления до версии 1.56.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Что стабилизировано в 1.56.0
Rust 2021
В мае мы писали о планах по выпуску редакции Rust 2021. Редакция — это механизм добавления изменений, которые могут нарушить обратную совместимость. О том, как это происходит, можно узнать в руководстве по редакциям. Эта редакция — небольшая, особенно по сравнению с 2018, однако в ней присутствует ещё несколько облегчающих жизнь изменений. Они требуют подтверждения обновления, чтобы избежать поломки в некоторых особых случаях в уже написанном коде. Для получения более подробной информации о новом функционале и о том, как произвести миграцию, предлагаем вам самим ознакомиться с новыми главами редакции:
- Непересекающийся захват в замыканиях: теперь замыкания захватывают отдельные именованные поля, а не как ранее — всегда идентификаторы целиком.
-
IntoIterator
для массивов:array.into_iter()
теперь итерирует элементы по значению, а не по ссылке. -
Или-шаблоны в макроправилах:
A|B
теперь — как и в$_:pat_param
— соответствуют верхнему уровню в$:pat
. - Теперь в Cargo по умолчанию используется распознаватель второй версии.
-
Добавлено в прелюдию:
TryInto
,TryFrom
иFromIterator
. -
Макрос panic теперь всегда ожидает форматированную строку, по аналогии с
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;
, чтобы захватить всю структуру, как раньше.
Миграция на 2021
Руководство включает инструкции по миграции для всех новых функций и в целом по переходу существующего проекта на новую версию. Во многих случаях cargo fix
может автоматизировать необходимые изменения. Вы даже можете обнаружить, что для версии 2021 никаких изменений в вашем коде не нужно!
Каким бы маленьким ни казалось это издание на первый взгляд, оно по-прежнему является результатом кропотливой работы многих участников, которых вы можете найти в отдельном трекере Rust 2021 celebration and thanks!
Cargo rust-version
Cargo.toml
теперь поддерживает поле [package]
rust-version
, которое используется, чтобы указать минимальную поддерживаемую версию 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, но было удалено из-за известной на то время несостоятельности. С развитием инструментария проверки заимствований, через долгие и интенсивные тесты компилятора команда определила, что это, все-таки, безопасно, и включила эту возможность в Rust!
Стабилизированные API
Стабилизированы следующие методы и реализации трейтов:
std::os::unix::fs::chroot
UnsafeCell::raw_get
BufWriter::into_parts
-
core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
(ранее было только вstd
) Vec::shrink_to
String::shrink_to
OsString::shrink_to
PathBuf::shrink_to
BinaryHeap::shrink_to
VecDeque::shrink_to
HashMap::shrink_to
HashSet::shrink_to
Следующие ранее стабилизированные API стали const
:
Прочие изменения
Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.
Участники 1.56.0
Множество людей собрались вместе, чтобы создать Rust 1.56.0 и 2021 редакцию. Мы не смогли бы сделать это без всех вас. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков. Также можете поддержать нас на OpenCollective.
Данную статью совместными усилиями перевели funkill, TelegaOvoshey, belanchuk и SomeAkk.
Комментарии (11)
Tuwogaka
23.10.2021 16:06-3Отлично, заинтересовались Rust. Идём на https://doc.rust-lang.org/book/ и читаем: This version of the text assumes you’re using Rust 1.54 or later with
edition="2018". Это как, считаем нормально?
С точки зрения простого человека так - если поправить просто, то почему не сделано, а если поправить сложно, то это обязательно должно было быть сделано...
ozkriff
23.10.2021 16:13+6А в чем именно беда и срочность? Новая редакция не так много изменений привносит, что бы они хоть как-то заметно сказывались на процессе обучения для новичка. Тем более что есть же https://doc.rust-lang.org/edition-guide/rust-2021
Tuwogaka
23.10.2021 19:20-5Я специально написал второй абзац чтобы предотвратить подобный ответ, хитрость не сработала. Если вносит мало изменений и все они уже собраны в одном месте, то что могло помешать потратить максимум два часа и поправить документацию, естественно, в предположении что кто-то всё ещё знает где там что?
На RustConf 2021 некий Нико Матсакис ставил задачу достижения широкого использования языка Rust и даже выражал некоторую готовность ради этого язык испоганить, по крайней мере в принципе. То, что новичка первым делом встречает грязь, с этой задачей вяжется с точность до наоборот.
enabokov
24.10.2021 09:10+6В магазине продают книги по C# 8, когда есть C# 10. Проведя аналогию, вы предлагаете срочно изъять эту "грязь" и мгновенно выпустить книги по новой версии. Отвечая на вопрос: да, это нормально. Требуется некоторое время и работа на приведение в соответствие с последней версией и дополнение книги небольшими деталями.
Tuwogaka
24.10.2021 11:15-1Спасибо. Я просто хотел убедиться, удалось 120% благодаря плюсикам и минусикам.
enabokov
25.10.2021 03:38Очень жду if let chains (https://rust-lang.github.io/rfcs/2497-if-let-chains.html), но пока только обсуждают как это должно выглядеть. До реализации очень далеко.
qthree
13.11.2021 17:08+1На найтли уже есть альтернатива которая возможно ещё более читабельная и позволяет разные ошибки возвращать https://rust-lang.github.io/rfcs/3137-let-else.htm
amarao
Ура! Писк восторга. Тот момент, когда изменения в новой редакции языка состоят на 80% из очень ожидаемых фич. Буквально каждая из них - радость.
Voronar
Ждём GAT до конца года.
grossws
А урезанный вариант реализации GAT не вошел в 1.56?
shiftdevy
Если я не ошибаюсь, то он вошёл в предыдущие версии. А полная реализация GAT уже доступна в nightly ветке.