Хабрахабр

[Перевод] Выпуск Rust 1.39.0: async/await, аттрибуты для параметров функций, новые константные функции

39. Команда Rust рада сообщить о выпуске новой версии, 1. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение. 0.

39. Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1. 0 вам достаточно выполнить следующую команду:

$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Что вошло в стабильную версию 1.39.0

Смотрите подробные примечания к выпуску для дополнительной информации. Наиболее существенные нововведения включают в себя синтаксис async/.await, разделяемые ссылки к перемещаемым значениям в match-guards и атрибуты у параметров функций.

С .await закончено, встречайте async fn

36. Ранее в Rust 1. Тогда же мы отметили, что: 0 мы объявили о доступности трейта Future.

Мы надеемся, что это нововведение позволит популярным крейтам, библиотекам и в целом всей экосистеме подготовиться к синтаксису async/.await, стабилизация которого планируется на недалёкое будущее.

Мы рады объявить, что долгожданный синтаксис async/.await, позволяющий определять асинхронные функции и блоки (async) и ожидать их выполнения (.await), наконец стабилизирован! Обещание дано — обещание выполнено.

Данный объект является приостановленным вычислением, завершить которое можно синтаксисом .await. Асинхронная функция, определяемая посредством синтаксиса async fn (вместо обычного fn), ничего не делает кроме того, что при вызове возвращает объект, реализующий трейт Future. } действуют как замыкания и могут использоваться для определения асинхронных литералов. Кроме того, async fn, async и async move { ...

Подробнее о выпуске async/.await можете почитать в посте блога Niko Matsakis.

Разделяемые ссылки к перемещаемым значениям в 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!(), }
}

39. Начиная с Rust 1. Надеемся, что это нововведение повысит удобство использования выражения match. 0, фрагмент выше компилятор примет без предупреждений и ошибок.

Атрибуты для параметров функций

39. Начиная с Rust 1. Раньше функция len() могла быть представлена следующим образом: 0, атрибуты можно применять для параметров функций, замыканий и указателей на функции.

#[cfg(windows)]
fn len(slice: &[u16]) -> usize { slice.len()
}
#[cfg(not(windows))] fn len(slice: &[u8]) -> usize { slice.len()
}

39. Но Rust 1. 0 позволяет написать приведённый выше код значительно проще:

fn len( #[cfg(windows)] slice: &[u16], // Этот параметр будет использован в операционной системе Windows. #[cfg(not(windows))] slice: &[u8], // В остальных случая будет использован этот параметр.
) -> usize { slice.len()
}

Атрибуты, пригодные к использованию, включают в себя:

  1. Условную компиляцию: cfg и cfg_attr;

  2. Управление проверками: allow, warn, deny и forbid;

  3. Вспомогательные атрибуты, используемые процедурными макросами-атрибутами для элементов синтаксиса.

    Надеемся, что данное нововведение поможет экосистеме в написании более выразительных DSL, основанных на макросах.

Миграционные предупреждения проверки заимствований становятся серьёзными ошибками в Rust 2018

35. В релизе 1. 31. 0 мы анонсировали, что новый анализатор заимствований (NLL) пришёл в редакцию Rust 2015 после того, как был выпущен для редакции Rust 2018 в версии 1.

35. Как указано в релизе 1. Эти ошибки были исправлены с помощью нового анализатора, реализующего NLL. 0, предыдущий анализатор заимствований был спроектирован с ошибками, допускавшими небезопасное использование памяти. Если это так, то ошибки вместо этого пока станут предупреждениями. Так как эти исправления могли сломать работающий код, команда Rust решила вводить их постепенно, проверяя, что предыдущий анализатор должен принять код, который новый анализатор отклонит.

39. Начиная с Rust 1. 40. 0, эти предупреждения теперь являются ошибками в редакции Rust 2018.
В следующем релизе Rust 1. 0, данное правило также будет применятся к коду редакции Rust 2015, что позволит полностью устранить старый анализатор заимствований из компилятора.

Если вас затронули эти изменения, или вы хотите узнать больше, почитайте пост в блоге Niko Matsakis.

Больше константных функций в стандартной библиотеке

39. Начиная с Rust 1. 0, следующие функции помечены как константные (const fn):

Стабилизированные функции в стандартной библиотеке

39. В Rust 1. 0 были стабилизированы следующие функции:

Другие изменения

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

Пожалуйста, прочтите заметки о совместимости, чтобы узнать, затронут ли вас эти изменения.

Участники 1.39.0

39. Множество людей собрались вместе, чтобы создать Rust 1. Мы не смогли бы сделать это без всех вас, спасибо! 0.

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

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

Данную статью совместными усилиями перевели andreevlex, blandger, funkill и Hippolot.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть