Класс OnceLock
Класс OnceLock из модуля std::sync представляет собой
потокобезопасную ячейку, которая может быть инициализирована
ровно один раз. После инициализации значение доступно только
для чтения и никогда не изменяется. Класс полезен для ленивой
инициализации глобальных данных, которые должны быть
вычислены один раз и использоваться из нескольких потоков.
Метод new создаёт пустую ячейку, метод set
пытается установить значение, метод get возвращает
ссылку на значение, если оно уже установлено, а метод
get_or_init инициализирует ячейку переданной функцией,
если она ещё пуста.
Синтаксис
use std::sync::OnceLock;
let cell: OnceLock<T> = OnceLock::new();
Пример
Давайте создадим ячейку OnceLock, установим в неё
значение и прочитаем его:
use std::sync::OnceLock;
fn main()
{
let cell: OnceLock<i32> = OnceLock::new();
let res = cell.set(12345);
println!("{:?}", res);
println!("{:?}", cell.get());
}
Результат выполнения кода:
Ok(())
Some(12345)
Пример
Давайте попробуем установить значение в ячейку дважды и посмотрим, что вернёт вторая попытка:
use std::sync::OnceLock;
fn main()
{
let cell: OnceLock<i32> = OnceLock::new();
cell.set(12345).unwrap();
let res = cell.set(67890);
println!("{:?}", res);
println!("{:?}", cell.get());
}
Результат выполнения кода:
Err(67890)
Some(12345)
Пример
Давайте используем метод 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"
Смотрите также
-
класс
Once,
который гарантирует однократное выполнение инициализации -
метод
new,
который создаёт новую пустую ячейку OnceLock -
метод
get,
который возвращает ссылку на значение, если оно установлено -
метод
get_or_init,
который инициализирует ячейку значением при первом обращении