Kotlin's reduce
берет первый элемент итератора за начальную точку, в то время как Rust's fold
и try_fold
позволяют указать пользовательскую начальную точку.
Вот эквивалент кода Котлина:
let mut it = nums.iter().cloned();
let start = it.next().unwrap();
it.zip(ops.iter()).try_fold(start, |a, (b, op)| match op {
'+' => Ok(a + b),
'-' => Ok(a - b),
_ => Err(()),
})
Детская площадка
Или, поскольку мы начинаем с вектора, который можно проиндексировать:
nums[1..]
.iter()
.zip(ops.iter())
.try_fold(nums[0], |a, (b, op)| match op {
'+' => Ok(a + b),
'-' => Ok(a - b),
_ => Err(()),
});
Детская площадка