Метод get_or_init
Метод get_or_init возвращает ссылку на значение,
хранящееся внутри OnceLock. Если значение уже было
установлено ранее, метод просто вернёт ссылку на него.
Если значение ещё не задано, метод вызовет переданную
функцию-инициализатор, сохранит её результат внутри
OnceLock и вернёт ссылку на него. Параметром метод
принимает функцию или замыкание без аргументов, которое
возвращает значение для инициализации.
Синтаксис
once_lock.get_or_init(f)
Пример
Давайте создадим OnceLock и инициализируем его
значением с помощью get_or_init:
use std::sync::OnceLock;
fn main()
{
let cell: OnceLock<i32> = OnceLock::new();
let res = cell.get_or_init(|| 42);
println!("{}", res);
}
Результат выполнения кода:
42
Пример
Давайте убедимся, что при повторном вызове
get_or_init функция-инициализатор больше не
вызывается, а возвращается уже сохранённое значение:
use std::sync::OnceLock;
fn main()
{
let cell: OnceLock<i32> = OnceLock::new();
let first = cell.get_or_init(|| {
println!("init");
100
});
let second = cell.get_or_init(|| {
println!("init again");
200
});
println!("{}", first);
println!("{}", second);
}
Результат выполнения кода:
init
100
100
Пример
Давайте используем get_or_init для ленивой
инициализации строки:
use std::sync::OnceLock;
fn main()
{
let cell: OnceLock<String> = OnceLock::new();
let res = cell.get_or_init(|| String::from("abcde"));
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Смотрите также
-
класс
OnceLock,
который представляет собой примитив синхронизации для однократной инициализации -
метод
new,
который создаёт новый пустой экземпляр OnceLock -
метод
get,
который возвращает ссылку на значение без его инициализации -
класс
Once,
который позволяет выполнить однократную инициализацию без хранения значения