РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1090 of 1245 menu

Класс 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,
    который инициализирует ячейку значением при первом обращении
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить