如何在Rust迭代器中获取索引以实现带行号的文本搜索?
Rust迭代器实现带行号的grep搜索
直接用迭代器的enumerate()方法就能解决你的问题,它可以给每个行元素添加上索引,完全不需要在collect()里做特殊操作,步骤如下:
- 先看教程里的基础迭代器写法:
fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { contents .lines() .filter(|line| line.contains(query)) .collect() }
- 修改成带行号的版本,只需要插入
enumerate()适配器:
fn search_with_line_numbers<'a>(query: &str, contents: &'a str) -> Vec<(usize, &'a str)> { contents .lines() .enumerate() // 给每个行元素添加从零开始的索引,返回(index, line)元组 .filter(|(_index, line)| line.contains(query)) // 过滤时忽略索引,只检查行内容 .map(|(index, line)| (index + 1, line)) // 把索引转成从1开始的实际行号 .collect() }
- 调用后遍历结果输出的示例:
let results = search_with_line_numbers("rust", contents); for (line_num, line) in results { println!("{}: {}", line_num, line); }
enumerate()是Rust迭代器的标准适配器,专门用来生成带索引的元素序列,完全适配你需要的带行号搜索场景,不需要绕到collect()里去处理索引。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

