本节实现一个经典的命令行工具:grep (globally search a regular expression and print)
该工具接受一个文件名和一个字符串作为参数,然后在执行时读取文件,输出包含字符串的所有行
实现的方法很简单:读取文件名和待搜查字符串。读取文件并储存于字符串,遍历每行并检查每行是否含有搜索字符串
完整代码和中文注释放在
nanogrep
有几个学习点:
接受命令行参数
std::env::args
返回一个命令行参数的迭代器,可以配合collect构造一个容器出来
let args:Vec<String> = env::args().collect();
注意,第一个值一定是二进制文件的名字,这一点和C是一样的
模块化
- 将程序拆为main.rs和lib.rs,将实际的业务逻辑放在lib.rs里
- main.rs主要是
- 调用lib.rs中的run函数
- 处理run函数可能存在的错误
错误处理逻辑
不要使用panic,而是将函数的返回值设为Result<T,E>
,并将错误不断的向上传递,最终在main函数中一并处理
测试驱动开发
- 想好需要的功能,编写一个现阶段会失败的测试,确保会如期运行失败
- 编写程序,让测试通过
- 保证测试通过的前提下重构代码
- 继续下一轮开发,返回步骤1
标准错误流
应当使用eprintln!
宏等将错误提示打印到标准错误流
这使得我们将标准输出流和标准错误流分开
可以将标准输出重定向,并保证我们仍能在控制台看到报错信息