Бесплатно Экспресс-аудит сайта:

09.08.2024

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

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

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

use std::sync::LazyLock;

static G_INT: LazyLock<u8> = LazyLock::new(|| 100);

fn main() {

let x = *G_INT; // инициализация произойдет здесь

// ...

}

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

use std::sync::OnceLock;

static G_INT: OnceLock<u8> = OnceLock::new();

fn main() {

let x = *G_INT.get_or_init(|| 100);

// ...

}

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

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

const K: u32 = 10u32.pow(3);

const M: u32 = 10u32.pow(6);

const G: u32 = 10u32.pow(9);

match n {

..K => "",

K..M => "k",

M..G => "M",

G.. => "G",

}

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

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

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