Rust学习之实现命令行小工具minigrep(二)
Estimated reading time: 4 minutes前言
继续记录一下Rust 语言学习过程,上次写了一个命令行查找字符串的小项目minigrep。学习完了闭包(Closures)和迭代器(Iterators)之后,我们使用这两个技术来改进minigrep这个项目。
本文源码:代码仓库
改进实现
在minigrep1 这个项目中,lib.rs文件,我们对Config的build方法中进行改进。
上次我们的代码如下:
代码里args: &[String] 表示传进来的是字符串的切片引用,而后面的Config 需要拥有query,file_path 以及ignore_case。所以在代码中不得不克隆一份。
改进build方法
现在可以使用迭代器(Iterators)代替&[String],对这里build方法进行改进,改进步骤如下:
- 直接将
env::args()传入Config::build方法,env::args()返回一个Iterator build方法声明中,args 参数类型改为impl Iterator<Item = String>- 使用迭代器的next方法获取元素并使用match语法进行匹配
main.rs
lib.rs
改进前:
改进后:
改进search方法
search方法中,是对文本进行遍历,进行判断查找。这里可以用迭代器,还可以用闭包。contents.lines() 返回一个迭代器
用迭代器把之前的for 循环都替换掉,使用filter时使用闭包
同理,search_case_insensitive方法也同样使用迭代器和闭包进行修改
改进前:
改进后:
总结
项目使用迭代器和闭包优化之后首先代码效率提高了,为了将引用切片转移到Config中需要使用消耗性能的clone方法,现在我们就不需要了。迭代器和迭代适配器filter 方法的使用让我们编写更加简明的代码。
