Функция 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,
которая создаёт итератор из начального значения и замыкания