Развернуть (начало, конец) пары в векторе - PullRequest
0 голосов
/ 05 мая 2020

У меня есть вектор (Vec<(usize, usize)>) пар (начало, конец), который исходит из find_iter(), и мне нужно, чтобы он был расширен до Vec<usize>. Под расширением я подразумеваю, что [(0, 3), (10, 13)] следует расширить до [0, 1, 2, 10, 11, 12]. Таким образом, каждое число между ними должно быть в ve c, начиная с start (включительно) и доходя до end (исключая). У меня есть рабочий код, но мне было интересно, есть ли более элегантный способ сделать это.

Вот минимальный пример:

use regex::Regex;

fn get_substring_indexes(string: &str, substring: &str) -> Vec<usize> {
    let mut indexes = Vec::new();
    for mat in Regex::new(substring).unwrap().find_iter(string) {
        indexes.extend(mat.range());
    }
    indexes
}

fn main() {
    println!("{:?}", get_substring_indexes("git add . git", "git"));
}

1 Ответ

2 голосов
/ 05 мая 2020

Range реализует Iterator, поэтому вы можете использовать их в качестве итераторов. Если вы хотите объединить и сгладить несколько итераторов, вы можете использовать flatten или, в данном случае, flat_map. Вот обновленный пример вашего кода:

ссылка на игровую площадку

use regex::Regex;

fn get_substring_indexes(string: &str, substring: &str) -> Vec<usize> {
    Regex::new(substring)
        .unwrap()
        .find_iter(string)
        .flat_map(|mat| mat.range())
        .collect()
}

fn main() {
    println!("{:?}", get_substring_indexes("git add . git", "git"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...