Команда Rust рада сообщить о новой версии языка — 1.56.0. С этим выпуском также стабилизируется 2021 редакция. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.56.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
В мае мы писали о планах по выпуску редакции Rust 2021. Редакция — это механизм добавления изменений, которые могут нарушить обратную совместимость. О том, как это происходит, можно узнать в руководстве по редакциям. Эта редакция — небольшая, особенно по сравнению с 2018, однако в ней присутствует ещё несколько облегчающих жизнь изменений. Они требуют подтверждения обновления, чтобы избежать поломки в некоторых особых случаях в уже написанном коде. Для получения более подробной информации о новом функционале и о том, как произвести миграцию, предлагаем вам самим ознакомиться с новыми главами редакции:
Замыкания автоматически захватывают значения или ссылки на идентификаторы, которые используются в теле замыкания, но до 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;, чтобы захватить всю структуру, как раньше.
Руководство включает инструкции по миграции для всех новых функций и в целом по переходу существующего проекта на новую версию. Во многих случаях cargo fix может автоматизировать необходимые изменения. Вы даже можете обнаружить, что для версии 2021 никаких изменений в вашем коде не нужно!
Каким бы маленьким ни казалось это издание на первый взгляд, оно по-прежнему является результатом кропотливой работы многих участников, которых вы можете найти в отдельном трекере Rust 2021 celebration and thanks!
Cargo.toml теперь поддерживает поле [package] rust-version, которое используется, чтобы указать минимальную поддерживаемую версию Rust для крейта. Cargo завершит работу с ранней ошибкой, если условие не выполнится. В настоящее время это не влияет на преобразователь зависимостей, но вся идея в том, чтобы выявить проблемы совместимости прежде, чем они превратятся в загадочные ошибки компилятора.
Сопоставление с шаблоном в 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 стали const:
Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать Rust 1.56.0 и 2021 редакцию. Мы не смогли бы сделать это без всех вас. Спасибо!
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.56.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Что стабилизировано в 1.56.0
Rust 2021
В мае мы писали о планах по выпуску редакции Rust 2021. Редакция — это механизм добавления изменений, которые могут нарушить обратную совместимость. О том, как это происходит, можно узнать в руководстве по редакциям. Эта редакция — небольшая, особенно по сравнению с 2018, однако в ней присутствует ещё несколько облегчающих жизнь изменений. Они требуют подтверждения обновления, чтобы избежать поломки в некоторых особых случаях в уже написанном коде. Для получения более подробной информации о новом функционале и о том, как произвести миграцию, предлагаем вам самим ознакомиться с новыми главами редакции:
- Непересекающийся захват в замыканиях: теперь замыкания захватывают отдельные именованные поля, а не как ранее — всегда идентификаторы целиком.
- IntoIterator для массивов: array.into_iter() теперь итерирует элементы по значению, а не по ссылке.
- Или-шаблоны в макроправилах: A|B теперь — как и в $_at_param — соответствуют верхнему уровню в $at .
- Теперь в 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:s::unix::fs::chroot
- UnsafeCell::raw_get
- BufWriter::into_parts
- core:anic::{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 1.56.0 и 2021 редакция
Команда Rust рада сообщить о новой версии языка — 1.56.0. С этим выпуском также стабилизируется 2021 редакция. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное...
habr.com