Новости Rust 1.80: следующий уровень производительности с LazyLock и LazyCell

NewsMaker

I'm just a script
Премиум
13,854
20
8 Ноя 2022
Новая версия популярного языка ускоряет и совершенствует код.


des08magv0os7lqy3od2nywtllnbj0f8.jpg


Для просмотра ссылки Войди или Зарегистрируйся популярного языка программирования Rust - 1.80 вносит ряд важных нововведений, которые должны упростить и оптимизировать разработку приложений.

Одним из главных новшеств стала стабилизация двух новых типов данных: LazyLock и LazyCell. Эти типы позволяют откладывать инициализацию переменных до момента их первого использования, вследствие чего повышается производительность программ. Вот пример применения LazyLock для ленивой инициализации:

<span style="font-family: "Courier New";">use std::sync::LazyLock; </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> static G_INT: LazyLock<u8> = LazyLock::new(|| 100); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> fn main() { </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> let x = *G_INT; // инициализация произойдет здесь </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> // ... </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> }</span>

В отличие от OnceLock, который также может использоваться для ленивой инициализации, LazyLock требует меньше кода и более практичен в применении:

<span style="font-family: "Courier New";">use std::sync::OnceLock; </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> static G_INT: OnceLock<u8> = OnceLock::new(); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> fn main() { </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> let x = *G_INT.get_or_init(|| 100); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> // ... </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> }</span>

Помимо LazyLock и LazyCell, в арсенале Rust есть и другие типы для управления инициализацией: OnceLock и OnceCell. Они обеспечивают однократную инициализацию данных и могут быть полезны в более сложных сценариях.

Кроме того, Rust 1.80 добавляет поддержку эксклюзивных диапазонов в конструкциях сопоставления с образцом. Теперь программисты могут использовать не только a..=b (включительно), но и a..b (исключительно):

<span style="font-family: "Courier New";">const K: u32 = 10u32.pow(3); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> const M: u32 = 10u32.pow(6); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> const G: u32 = 10u32.pow(9); </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> match n { </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> ..K => "", </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> K..M => "k", </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> M..G => "M", </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> G.. => "G", </span>

<span style="font-family: "Courier New";"> </span> <span style="font-family: "Courier New";"> }</span>

Для предотвращения ошибок при переходе на эксклюзивные диапазоны Rust 1.80 вводит два новых предупреждения компилятора: non_contiguous_range_endpoints и overlapping_range_endpoints.

Еще одно интересное нововведение - поддержка вариативных функций без именованного параметра. Это сближает Rust с грядущим стандартом C23, который предусматривает такой же синтаксис.

В целом, обновление Rust 1.80 предлагает разработчикам ряд полезных инструментов для повышения производительности и выразительности кода. Стабилизация LazyLock, LazyCell и расширение возможностей сопоставления с образцом - важные шаги в развитии языка.
 
Источник новости
www.securitylab.ru

Похожие темы