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

Трейт FnOnce

Трейт FnOnce описывает вызываемые объекты, которые можно вызвать ровно один раз. Он является одним из трёх трейтов для вызовов наряду с Fn и FnMut. Параметром метод call_once принимает значение типа Self::Output и возвращает результат вызова. Особенность FnOnce в том, что при вызове замыкание может поглотить захваченные переменные, переместив их внутрь себя, поэтому повторный вызов становится невозможен. Любое замыкание, которое реализует Fn или FnMut, автоматически реализует и FnOnce, но не наоборот.

Синтаксис

trait FnOnce<Args> { type Output; fn call_once(self, args: Args) -> Self::Output; }

Пример

Давайте создадим замыкание, которое поглощает переменную "abcde" и вызывается один раз:

fn main() { let s = String::from("abcde"); let consume = move || s; let res = consume(); println!("{}", res); }

Результат выполнения кода:

abcde

Пример

Давайте напишем функцию, которая принимает замыкание с ограничением FnOnce и вызывает его ровно один раз:

fn call_once_fn<F>(f: F) where F: FnOnce() -> i32, { let res = f(); println!("{}", res); } fn main() { let s = String::from("12345"); call_once_fn(move || s.len() as i32); }

Результат выполнения кода:

5

Пример

Давайте посмотрим, как замыкание с перемещением захваченного вектора может быть вызвано только один раз:

fn main() { let v = vec![1, 2, 3, 4, 5]; let consume = move || v; let res = consume(); println!("{:?}", res); }

Результат выполнения кода:

[1, 2, 3, 4, 5]

Смотрите также

  • трейт Fn,
    который описывает замыкания, вызываемые многократно без изменения состояния
  • трейт FnMut,
    который описывает замыкания, вызываемые многократно с изменением состояния
  • трейт Trait Bound,
    который задаёт ограничения на обобщённые типы через трейты
  • трейт impl Trait,
    который позволяет указывать трейт в позиции возвращаемого типа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить