用 Rust 写一个实用小工具:从“会语法”到“能交付”
很多人学 Rust 会卡在同一个地方:书看完了,示例也跑通了,但不知道下一步该写什么。其实 Rust 真正让人上瘾的时刻,往往不是读完所有权那一章,而是你第一次用 cargo build --release 打出一个几十 MB 以内、启动飞快、内存稳定、还能跨平台运行的二进制文件。
这篇文章不讲太多理论,只围绕一个目标:用 Rust 把一个真实的小工具做出来。
为什么从“小工具”开始?
Rust 的编译器很严格,所有权、借用、生命周期一开始确实会劝退人。但如果你只对着概念练习,很容易陷入“好像懂了,又好像没懂”的状态。
更好的方式是找一个边界清晰的小项目,比如:
- 批量重命名文件
- 本地日志搜索工具
- 文件夹大小统计
- 简易 HTTP 服务
- 本地待办事项管理
- 一个带界面的小工具
这类项目不会一开始就要求你处理分布式系统、复杂并发或底层驱动,但足够让你接触到 Rust 日常开发里真正重要的东西:类型、错误处理、模块化、CLI 或界面、文件/网络 IO、打包发布。
一个适合练手的方向:本地文件搜索工具
假设我们要做一个类似 grep / ripgrep 的简化版工具:给定一个目录和一个关键词,递归搜索所有文本文件,输出匹配行和所在文件。
它看起来简单,但能覆盖很多 Rust 核心能力:
- 用
clap解析命令行参数 - 用
std::fs遍历目录 - 用
Result处理文件读取错误 - 用迭代器过滤文本行
- 用
cargo build --release发布可执行文件 - 后续还可以加上多线程搜索、正则匹配、颜色输出
这类工具也很适合 Rust:不需要庞大运行时,编译出来就是一个独立二进制,发给别人就能跑。
项目结构可以这样设计
不要一上来就写一个巨大的 main.rs。哪怕是很小的项目,也可以提前养成模块化习惯:
src/
main.rs # CLI 入口
search.rs # 搜索逻辑
output.rs # 结果格式化
main.rs 只负责解析参数、调用搜索模块、打印结果;search.rs 负责遍历目录和匹配内容;output.rs 负责决定输出格式。这样后面如果你想加 JSON 输出、颜色高亮、多线程搜索,改动都会更清晰。
错误处理要早点养成习惯
新手写 Rust 很容易到处用 unwrap()。练习阶段可以临时用,但正式一点的项目里,最好尽早习惯 Result 和 ?。
比如读取文件时,不要只写:
let content = std::fs::read_to_string(path).unwrap();
更稳妥的写法是允许错误被返回:
fn read_file(path: &std::path::Path) -> Result<String, std::io::Error> {
std::fs::read_to_string(path)
}
Rust 的好处就在这里:它不会让你假装错误不存在。你可能一开始会觉得麻烦,但写多了会发现,这种“编译期强迫症”确实能减少很多线上隐患。
如果想做界面,Tauri 2 是个很好的落地点
纯命令行工具已经足够练手,但如果你想更进一步,可以试试 Tauri 2。它的思路很清晰:前端用 Web 技术写界面,后端用 Rust 处理系统能力,两者通过 IPC 通信。
和 Electron 不同,Tauri 不会打包整个 Chromium,而是使用系统自带的 WebView,所以安装包通常只有几兆到十几兆,内存占用也低很多。 对于想兼顾性能和轻量体验的开发者来说,它比 Electron 更友好。
一个典型的 Tauri 命令长这样:
#[tauri::command]
fn search(keyword: &str, path: &str) -> Vec<String> {
// 这里调用你的 Rust 搜索逻辑
vec![]
}
前端通过 invoke 调用它:
const results = await invoke('search', { keyword: 'hello', path: './logs' });
这样一来,你的 Rust 代码就不再只是“练习题”,而是真正承担应用后端逻辑的部分。
2026 年学 Rust,生态已经比几年前友好很多
现在的 Rust 生态已经不只是“能写系统程序”了。后端有 Axum、Actix-web,异步运行时 Tokio 非常成熟,桌面开发可以用 Tauri 2,AI 推理也有 Candle、Burn 这类原生框架。 编译器提示、增量编译和工具链体验也在持续改善。
它依然不算一门轻松的语言,但已经足够实用。你不需要先成为系统编程专家,也不需要把所有权理论背得滚瓜烂熟,才能开始写东西。
给自己一个“可交付”的小目标
学 Rust 最好的节奏,不是每天刷语法题,而是尽快做出一个能跑、能打包、能给别人用的东西。
比如这周就可以定一个小目标:
- 完成一个命令行文件搜索工具
- 支持指定目录和关键词
- 支持输出匹配行号和文件路径
- 用
cargo build --release打包 - 如果有余力,再用 Tauri 给它套一个简单界面
Rust 的学习曲线确实存在,但它回报你的方式也很直接:你会更清楚数据在哪里、谁拥有它、谁可以修改它、错误从哪里来、程序为什么会崩溃。写久了之后,这种“被编译器管着”的感觉,反而会变成一种安全感。
- 点赞
- 收藏
- 关注作者
评论(0)