Каков наилучший способ разыменования значений в цепочках итераторов? - PullRequest
0 голосов
/ 04 февраля 2020

Когда я использую итераторы, мне часто приходится явно разыменовывать значения. Следующий код находит сумму всех пар элементов в векторе:

extern crate itertools;

use crate::itertools::Itertools;

fn main() {
    let x: Vec<i32> = (1..4).collect();

    x.iter()
        .combinations(2)
        .map(|xi| xi.iter().map(|bar| **bar)
        .sum::<i32>())
        .for_each(|bar| println!("{:?}", bar));
}

Есть ли лучший способ выполнить разыменование, чем использование map?

Еще лучше было бы способ выполнения этих типов операций без разыменования вообще.

1 Ответ

1 голос
/ 04 февраля 2020

Использование xi.iter() означает, что вы явно запрашиваете итератор , ссылающийся на значения в xi. Поскольку в этом случае вам не нужны ссылки, а вместо этого нужны фактические значения, вам нужно использовать xi.into_iter(), чтобы получить итератор для значений.

Таким образом, вы можете изменить

.map(|xi| xi.iter().map(|bar| **bar).sum::<i32>())

до

.map(|xi| xi.into_iter().sum::<i32>())

Playground Link

...