Как получить индекс текущего элемента, обрабатываемого в итерации без цикла for? - PullRequest
0 голосов
/ 06 ноября 2019

Я прочитал Как перебрать Vec с индексированной позицией? , где ответом будет использование enumerate в for -цикле.

Но еслиЯ не использую for -петлек, как это:

fn main() {
    let v = vec![1; 10]
        .iter()
        .map(|&x| x + 1  /* + index */ ) // <--
        .collect::<Vec<_>>();

    print!("v{:?}", v);
}

Как я могу получить индекс в приведенном выше замыкании?

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Вы также можете использовать enumerate!

let v = vec![1; 10]
    .iter()
    .enumerate()
    .map(|(i, &x)| x + i)
    .collect::<Vec<_>>();

println!("v{:?}", v);   // prints v[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Посмотрим, как это работает. Iterator::enumerate возвращает Enumerate<Self>. Этот тип также реализует Iterator:

impl<I> Iterator for Enumerate<I>
where
    I: Iterator,
{
    type Item = (usize, <I as Iterator>::Item);
    // ...
}

Как видите, новый итератор выдает кортежи индекса и исходного значения.

1 голос
/ 06 ноября 2019

Вы можете просто использовать enumerate:

fn main() {
    let v = vec![1; 10]
        .iter()
        .enumerate()
        .map(|(i, x)| i + x)
        .collect::<Vec<_>>();

    print!("v{:?}", v);
}

Причина этого в том, что цикл for принимает перечислитель: в несколько более абстрактных терминах:

for var in expression {
    code
}

Выражение является итератором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...