Выпуск Rust 1.56.0 и 2021 редакция

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Команда 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:


  • std::mem::transmute

Прочие изменения


Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.


Участники 1.56.0


Множество людей собрались вместе, чтобы создать Rust 1.56.0 и 2021 редакцию. Мы не смогли бы сделать это без всех вас. Спасибо!


От переводчиков


С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков. Также можете поддержать нас на OpenCollective.


Данную статью совместными усилиями перевели funkill, TelegaOvoshey, belanchuk и SomeAkk.

Источник: https://habr.com/ru/post/585052/


Интересные статьи

Интересные статьи

За последний год в нашем мире так много изменилось, и React Native не исключение. Мы приветствовали новых членов в нашей команде (с которыми мы очень рады встретиться лично!), наши проекты созрели, и ...
Всем привет! Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. Главные темы нового выпу...
С 18 по 21 мая 2021 года на киберполигоне The Standoff прошло очередное противостояние между атакующими и защитниками. Бои проходили в вымышленном городе FF, представляющ...
Продолжаем знакомить вас с выпускниками магистратуры JetBrains и ИТМО «Разработка программного обеспечения», которые по завершении обучения пополнили преподавательский состав программы. В...
В 2020 году многие аспекты повседневной жизни серьезно изменились. Всеобщая «удаленка» и рекордная цифровизация большинства отраслей не могла не трансформировать и ландшафт информационной...