Какова альтернатива операции «уменьшить» Котлина в Rust? - PullRequest
0 голосов
/ 27 февраля 2019

Я столкнулся с этой проблемой конкурентного программирования:

  1. nums - это вектор целых чисел (длина n)
  2. ops - это вектор строк, содержащий + и - (длина n-1)

Это можно решить с помощью операции reduce в Котлине следующим образом:

val op_iter = ops.iterator();
nums.reduce {a, b ->
    when (op_iter.next()) {
        "+" -> a+b
        "-" -> a-b
        else -> throw Exception()
    }
}

reduce описывается как:

Накапливает значение, начиная с первого элемента и применяя операцию слева направо к текущему значению аккумулятора и каждого элемента.

ПохожеВекторы ржавчины не имеют reduce метода.Как бы вы достигли этой задачи?

1 Ответ

0 голосов
/ 27 февраля 2019

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(()),
    });

Детская площадка

...