第12章 I/O 项目:构建命令行程序

回顾已学知识,并用标准库构建命令行搜索工具 minigrep

译文 · 基于 The Rust Programming Language(rustc 1.97.1)

I/O 项目:构建命令行程序

原文链接: https://doc.rust-lang.org/stable/book/ch12-00-an-io-project.html

  本章既是对目前所学诸多技能的回顾,也会继续探索一些标准库功能。我们将构建一个与文件和命令行输入/输出交互的命令行工具,借此练习你已经掌握的 Rust 概念。

  Rust 速度快、内存安全、能产出单一二进制文件,并且跨平台支持出色,非常适合编写命令行工具。因此在本项目中,我们会实现经典命令行搜索工具 grep(globally search a regular expression and print)的简化版。最简单的用法是:grep 在指定文件中搜索指定字符串。为此,它接收文件路径和字符串作为参数,然后读取文件,找出包含该字符串的行,并打印这些行。

  过程中,我们还会演示如何让命令行工具使用许多同类工具都会用到的终端特性:读取环境变量以便用户配置行为;把错误信息打印到标准错误流(stderr)而不是标准输出(stdout),这样用户就可以把成功输出重定向到文件,同时仍在屏幕上看到错误信息。

  Rust 社区成员 Andrew Gallant 已经写出了功能完备、速度极快的 grep 实现,名为 ripgrep。相比之下,我们的版本会相当简单,但本章会为你理解像 ripgrep 这样的真实项目打下一些必要的背景知识。

  我们的 grep 项目将综合运用此前学过的多个概念:

  我们还会简要介绍闭包(closure)、迭代器(iterator)和特征对象(trait object),这些内容将在 第 13 章 和 第 18 章 中详细讲解。


12.1 接受命令行参数

用 std::env::args 读取并保存命令行参数

12.2 读取文件

用 fs::read_to_string 读取文件内容

12.3 重构以改进模块化与错误处理

分离关注点、Config 结构体与 Result 错误处理重构

12.4 用测试驱动开发增加功能

用 TDD 实现 search 函数并验证搜索行为

12.5 使用环境变量

通过环境变量控制大小写不敏感搜索

12.6 将错误输出重定向到标准错误

用 eprintln! 把错误信息写到标准错误而非标准输出

最后修改 August 11, 2026: 更新 (70a5af133)