Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpSyLz 143 of 288 menu
◀ ▶

Ленивая инициализация в Rust

Иногда тяжелое значение не нужно сразу при старте программы. Ленивое значение хранит замыкание, которое считает результат один раз, когда к нему впервые обращаются, а дальше отдает уже готовый объект.

Тип появился в стандартной библиотеке с версии 1.80 и живет рядом с замками в модуле синхронизации. Отдельный пакет once_cell для этого примера не нужен.

Объявим статическое ленивое значение со строкой и прочитаем его два раза:

use std::sync::LazyLock; static READY: LazyLock<String> = LazyLock::new(|| String::from("ready")); fn main() { println!("{}", *READY); println!("{}", *READY); }

На экране два раза ready. Замыкание со сборкой строки сработало один раз при первом обращении, второй вывод взял уже сохраненный текст.

Тот же прием с числом, которое считают внутри замыкания:

use std::sync::LazyLock; static TOTAL: LazyLock<i32> = LazyLock::new(|| 6 + 6); fn main() { println!("{}", *TOTAL); }

Дано число:

let num = 9;

Оформите статическое ленивое значение, которое при первом чтении отдает этот литерал, и выведите его.

Скажите, сколько раз выполнится замыкание в примере со строкой "ready", если программа дважды печатает значение.

Дано число:

let num = 3;

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

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить