如何在Rust中使用迭代器获取使用索引?[duplicate]

zaq34kh6  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(211)

此问题在此处已有答案

How to get the index of the current element being processed in the iteration without a for loop?(2个答案)
昨天关门了。
所以我接下来用Rust Book tutorial写一个grep克隆,书中首先给出了这个函数在文件中搜索给定字符串的例子:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    let mut results = Vec::new();

    for line in contents.lines() {
        if line.contains(query) {
            results.push(line);
        }
    }

    results
}

然后我将其修改为results将包含找到匹配的行号,如下所示:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<String> {
    let mut results = Vec::new();

    for (index, line) in contents.lines().enumerate() {
        if line.to_lowercase().contains(&query) {
            let line_found = &index + 1;
            results.push(String::from(format!("Line {line_found}: {line}")));
        }
    }

    results
}

接下来,这些书展示了如何使用迭代器来使代码更简单、更干净:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    contents
        .lines()
        .filter(|line| line.contains(query))
        .collect()
}

我很难弄清楚如何获得相同的功能来包含在这个函数中找到匹配的行号。在collect()中,有没有办法让我访问迭代器的索引和行本身?

qyswt5oh

qyswt5oh1#

使用enumerate,它将Iterator<Item = T>转换为Iterator<Item = (usize, T)>,其中元组的第一个元素是索引。您已经在第二个示例中使用了它,它也可以在转换后的版本中使用,因为它仍然是一个迭代组合子。

相关问题