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

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