Ленивая инициализация в 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;
Сохраните литерал в ленивом значении через замыкание без аргументов и выведите результат после первого обращения.