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

Функция from_fn

Функция from_fn создаёт итератор, который на каждом шаге вызывает переданное замыкание и возвращает его результат. Параметром функция принимает замыкание без аргументов, возвращающее значение Some для очередного элемента или None для завершения итерации. Такой итератор удобен, когда последовательность элементов нужно порождать программно, а не брать из готовой коллекции.

Синтаксис

std::iter::from_fn(f)

Пример

Давайте создадим итератор, который выдаёт числа от 1 до 5, а затем соберём их в вектор:

fn main() { let mut n = 0; let iter = std::iter::from_fn(move || { n += 1; if n <= 5 { Some(n) } else { None } }); let res: Vec<i32> = iter.collect(); println!("{:?}", res); }

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

[1, 2, 3, 4, 5]

Пример

Давайте создадим бесконечный итератор, выдающий степени числа 2, и возьмём из него только первые 5 элементов:

fn main() { let mut value = 1; let iter = std::iter::from_fn(move || { let current = value; value *= 2; Some(current) }); let res: Vec<i32> = iter.take(5).collect(); println!("{:?}", res); }

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

[1, 2, 4, 8, 16]

Пример

Давайте создадим итератор, который выдаёт строки "a", "b" и "c", а затем завершается:

fn main() { let mut n = 0; let iter = std::iter::from_fn(move || { n += 1; match n { 1 => Some("a"), 2 => Some("b"), 3 => Some("c"), _ => None, } }); let res: Vec<&str> = iter.collect(); println!("{:?}", res); }

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

["a", "b", "c"]

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

  • типаж Iterator,
    который описывает поведение всех итераторов
  • функция once,
    которая создаёт итератор из одного элемента
  • функция repeat,
    которая создаёт бесконечный итератор из одного элемента
  • функция successors,
    которая создаёт итератор из начального значения и замыкания
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить