Метод fold
Метод fold сворачивает элементы итератора
в одно итоговое значение. Он принимает начальное
значение аккумулятора и замыкание, которое
вызывается для каждого элемента. Замыкание получает
текущее значение аккумулятора и очередной элемент,
а возвращает новое значение аккумулятора.
Параметром метод принимает начальное значение
и функцию-замыкание с двумя аргументами.
Синтаксис
iterator.fold(init, |acc, item| { ... })
Пример
Давайте найдём сумму всех элементов вектора
[1, 2, 3, 4, 5], начиная с нуля:
fn main()
{
let res = vec![1, 2, 3, 4, 5]
.iter()
.fold(0, |acc, x| acc + x);
println!("{}", res);
}
Результат выполнения кода:
15
Пример
Давайте соберём строку из элементов вектора
["a", "b", "c", "d", "e"],
начав с пустой строки:
fn main()
{
let res = vec!["a", "b", "c", "d", "e"]
.iter()
.fold(String::new(), |acc, x| acc + x);
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Пример
Давайте найдём максимальный элемент вектора
[1, 2, 3, 4, 5] с помощью метода fold:
fn main()
{
let res = vec![1, 2, 3, 4, 5]
.iter()
.fold(0, |acc, x| if *x > acc { *x } else { acc });
println!("{}", res);
}
Результат выполнения кода:
5
Пример
Давайте посчитаем количество чётных чисел в векторе
[1, 2, 3, 4, 5] с помощью метода fold:
fn main()
{
let res = vec![1, 2, 3, 4, 5]
.iter()
.fold(0, |acc, x| if x % 2 == 0 { acc + 1 } else { acc });
println!("{}", res);
}
Результат выполнения кода:
2