- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о выпуске новой версии, 1.39.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.39.0 вам достаточно выполнить следующую команду:
$ rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску [2] на GitHub.
Наиболее существенные нововведения включают в себя синтаксис async/.await, разделяемые ссылки к перемещаемым значениям в match-guards и атрибуты у параметров функций. Смотрите подробные примечания к выпуску [2] для дополнительной информации.
.await закончено, встречайте async fnРанее в Rust 1.36.0 мы объявили [3] о доступности трейта Future [4]. Тогда же мы отметили, что:
Мы надеемся, что это нововведение позволит популярным крейтам, библиотекам и в целом всей экосистеме подготовиться к синтаксису
async/.await, стабилизация которого планируется на недалёкое будущее.
Обещание дано — обещание выполнено. Мы рады объявить, что долгожданный синтаксис async/.await, позволяющий определять асинхронные функции и блоки (async) и ожидать их выполнения (.await), наконец стабилизирован!
Асинхронная функция, определяемая посредством синтаксиса async fn (вместо обычного fn), ничего не делает кроме того, что при вызове возвращает объект, реализующий трейт Future. Данный объект является приостановленным вычислением, завершить которое можно синтаксисом .await. Кроме того, async fn, async { ... } и async move { ... } действуют как замыкания и могут использоваться для определения асинхронных литералов.
Подробнее о выпуске async/.await можете почитать в посте блога Niko Matsakis [5].
match-guardsПри сопоставлении с образом переменную, известную как "байндинг" (binding), можно привязать одним из следующих способов:
По ссылке, неизменной или изменяемой. Это можно сделать явно, например, синтаксисом ref my_var или ref mut my_var соответственно. Почти всегда режим привязки будет выведен автоматически.
По значению — либо копированием (если тип привязанной переменной реализует трейт Copy), либо передачей во владение.
Ранее Rust запрещал взятие совместных ссылок (shared references) на переменные-привязки во владение в коде с if при наличии (guards) выражения match. Таким образом, что следующий код был бы отвергнут:
fn main() {
let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
match array {
nums
// ---- `nums` привязан с владением (by move).
if nums.iter().sum::<u8>() == 10
// ^------ `.iter()` берется явная ссылка на `nums`
=> {
drop(nums);
// ----------- `nums` привязан и в нашем владении
}
_ => unreachable!(),
}
}
Начиная с Rust 1.39.0 [6], фрагмент выше компилятор примет без предупреждений и ошибок. Надеемся, что это нововведение повысит удобство использования выражения match.
Начиная с Rust 1.39.0, атрибуты можно применять для параметров функций, замыканий и указателей на функции. Раньше функция len() могла быть представлена следующим образом:
#[cfg(windows)]
fn len(slice: &[u16]) -> usize {
slice.len()
}
#[cfg(not(windows))]
fn len(slice: &[u8]) -> usize {
slice.len()
}
Но Rust 1.39.0 позволяет написать [7] приведённый выше код значительно проще:
fn len(
#[cfg(windows)] slice: &[u16], // Этот параметр будет использован в операционной системе Windows.
#[cfg(not(windows))] slice: &[u8], // В остальных случая будет использован этот параметр.
) -> usize {
slice.len()
}
Атрибуты, пригодные к использованию, включают в себя:
Условную компиляцию: cfg и cfg_attr;
Управление проверками: allow, warn, deny и forbid;
Вспомогательные атрибуты, используемые процедурными макросами-атрибутами для элементов синтаксиса.
Надеемся, что данное нововведение поможет экосистеме в написании более выразительных DSL, основанных на макросах.
В релизе 1.35.0 мы анонсировали [8], что новый анализатор заимствований (NLL) пришёл в редакцию Rust 2015 после того, как был выпущен для редакции Rust 2018 в версии 1.31 [9].
Как указано в релизе 1.35.0, предыдущий анализатор заимствований был спроектирован с ошибками, допускавшими небезопасное использование памяти. Эти ошибки были исправлены с помощью нового анализатора, реализующего NLL. Так как эти исправления могли сломать работающий код, команда Rust решила вводить их постепенно, проверяя, что предыдущий анализатор должен принять код, который новый анализатор отклонит. Если это так, то ошибки вместо этого пока станут предупреждениями.
Начиная с Rust 1.39.0, эти предупреждения теперь являются ошибками в редакции Rust 2018 [10].
В следующем релизе Rust 1.40.0, данное правило также будет применятся к коду редакции Rust 2015 [11], что позволит полностью устранить старый анализатор заимствований [12] из компилятора.
Если вас затронули эти изменения, или вы хотите узнать больше, почитайте пост в блоге Niko Matsakis [13].
Начиная с Rust 1.39.0, следующие функции помечены как константные (const fn):
Vec::new [14], String::new [15] и LinkedList::new [16];str::len [17], [T]::len [18] и str::as_bytes [18];abs [19], wrapping_abs [19] и overflowing_abs [20].В Rust 1.39.0 были стабилизированы следующие функции:
Pin::into_inner [21];Instant::checked_duration_since [22] и Instant::saturating_duration_since [23].Синтаксис [2], пакетный менеджер Cargo [24] и анализатор Clippy [25] также претерпели некоторые изменения.
Пожалуйста, прочтите заметки о совместимости [26], чтобы узнать, затронут ли вас эти изменения.
Множество людей собрались вместе, чтобы создать Rust 1.39.0. Мы не смогли бы сделать это без всех вас, спасибо [27]!
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [28] или же в аналогичном чате для новичковых вопросов [29].
Данную статью совместными усилиями перевели andreevlex [30], blandger [31], funkill [32] и Hippolot [33].
Автор: RustLangRu
Источник [34]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/335824
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/install.html
[2] подробные примечания к выпуску: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1390-2019-11-07
[3] мы объявили: https://blog.rust-lang.org/2019/07/04/Rust-1.36.0.html#the-future-is-here
[4] Future: https://doc.rust-lang.org/nightly/std/future/trait.Future.html
[5] в посте блога Niko Matsakis: https://blog.rust-lang.org/2019/11/07/Async-await-stable.html
[6] Начиная с Rust 1.39.0: https://github.com/rust-lang/rust/pull/63118/#issuecomment-522823925
[7] позволяет написать: https://github.com/rust-lang/rust/pull/64010/
[8] мы анонсировали: https://blog.rust-lang.org/2019/07/04/Rust-1.36.0.html#nll-for-rust-2015
[9] 1.31: https://blog.rust-lang.org/2018/12/06/Rust-1.31-and-rust-2018.html#non-lexical-lifetimes
[10] ошибками в редакции Rust 2018: https://github.com/rust-lang/rust/pull/63565
[11] данное правило также будет применятся к коду редакции Rust 2015: https://github.com/rust-lang/rust/pull/64221
[12] устранить старый анализатор заимствований: https://github.com/rust-lang/rust/pull/64790
[13] пост в блоге Niko Matsakis: https://blog.rust-lang.org/2019/11/01/nll-hard-errors.html
[14] Vec::new: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.new
[15] String::new: https://doc.rust-lang.org/std/string/struct.String.html#method.new
[16] LinkedList::new: https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.new
[17] str::len: https://doc.rust-lang.org/std/primitive.str.html#method.len
[18] [T]::len: https://doc.rust-lang.org/std/primitive.slice.html#method.len
[19] abs: https://doc.rust-lang.org/std/primitive.i8.html#method.abs
[20] overflowing_abs: https://doc.rust-lang.org/std/primitive.i8.html#method.overflowing_abs
[21] Pin::into_inner: https://doc.rust-lang.org/std/pin/struct.Pin.html#method.into_inner
[22] Instant::checked_duration_since: https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_duration_since
[23] Instant::saturating_duration_since: https://doc.rust-lang.org/std/time/struct.Instant.html#method.saturating_duration_since
[24] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-139-2019-11-07
[25] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-139
[26] заметки о совместимости: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#compatibility-notes
[27] спасибо: https://thanks.rust-lang.org/rust/1.39.0/
[28] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[29] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[30] andreevlex: https://habr.com/ru/users/andreevlex/
[31] blandger: https://habr.com/ru/users/blandger/
[32] funkill: https://habr.com/ru/users/funkill/
[33] Hippolot: https://habr.com/ru/users/hippolot/
[34] Источник: https://habr.com/ru/post/474808/?utm_source=habrahabr&utm_medium=rss&utm_campaign=474808
Нажмите здесь для печати.