趣味学RUST基础篇(构建命令行程序1)

用 Rust 打造你的专属“寻宝探测器”!

这一节,我们开始做一个小程序,顺便把前面的内容回顾一下。现在,你是一位探险家,面前堆着成山的古老卷轴(文件),而你的任务是:在最短的时间内,找到所有写着“藏宝图在此!”这几个字的卷轴

手动一页页翻?太慢了!你需要一个超级探测器!这,就是我们今天要用 Rust 打造的——一个属于你自己的 grep 命令行小工具,我们可以叫它“寻宝探测器”!

使用Rust做的工具不仅快如闪电(运行速度),还坚不可摧(安全性高),而且打包出来就一个小巧的独立盒子(单一二进制文件),不管是在 Windows、Mac 还是 Linux 的探险营地里,都能直接打开就用!简直是造“探险工具”的完美人选

我们的“寻宝探测器”能干啥?

很简单,三步搞定:

  1. 告诉它目标:比如“藏宝图在此!”。
  2. 告诉它在哪找:比如“山洞里的卷轴.txt”。
  3. 按下启动键!它就会“唰唰唰”地翻完所有文件,把所有写着目标文字的行都亮出来给你看!

给探测器加点“高科技”!

为了让我们的探测器更像一个“专业级”装备,我们还要给它加几个酷炫功能:

  • 环境变量 - “探险模式”开关
    比如,你可以设置一个叫 CASE_INSENSITIVE(忽略大小写)的环境变量。如果打开它,探测器就都能找到,不会因为大小写而错过宝藏!

  • 聪明的“双屏显示”
    探测器工作时,如果一切顺利,它会把找到的宝藏行显示在“主屏幕”(标准输出 stdout)。但如果它遇到问题,比如文件找不到了,它会立刻把“警报信息”显示在“红色警示屏”(标准错误 stderr)上。这样,你甚至可以把主屏幕的输出存到一个“宝藏清单.txt”文件里,而红色警报依然会闪在屏幕上提醒你!互不干扰!

这次“造工具”能学到啥?

这次动手,就像一次“知识大阅兵”!我们会把之前学的本事统统用上:

  • 模块:把探测器的“扫描头”、“分析仪”、“显示屏”分开放,不乱套。
  • 字符串和向量:处理文本和数据列表的基石。
  • 错误处理:让探测器遇到“死胡同”时,不会直接死机,而是优雅地告诉你“此路不通”。
  • 测试:在正式寻宝前,先用假卷轴测试探测器,确保它不会指错路。

还会提前尝鲜一点新科技:

  • 闭包:一种可以“记住环境”的小函数。
  • 迭代器:让数据像流水线一样被高效处理。
  • Trait 对象:让不同类型的“探测头”都能装在同一个探测器上。

第一步:给你的“寻宝探测器”装上“耳朵”!

现在,它还是个“聋子”,你对着它喊“找‘宝藏’!在‘地图.txt’里!”,它完全听不懂。所以,第一步,我们要给它装上一对灵敏的“耳朵”——命令行参数接收器

开工!创建项目

首先,打开你的“工具作坊”(终端),敲下命令:

cargo new minigrep

恭喜!一个名叫 minigrep 的新工具项目诞生了!(叫 minigrep 是为了和系统里可能存在的专业版区分开,显得我们很专业~)

让探测器“听见”你的话

现在,我们的探测器还听不懂人话。我们需要教它如何“听”懂你输入的指令。

Rust 为我们准备了一个神奇的“助听器”——std::env::args() 函数。它就像一个“声音收集器”,能把你在命令行输入的所有词都“听”下来。

我们把这些词收集到一个“词袋子”(vector)里,然后倒出来看看:

use std::env; // 引入“助听器”模块

fn main() {
    let args: Vec<String> = env::args().collect(); // 把听到的词全装进袋子
    println!("{:?}", args); // 把袋子倒出来,看看都有啥
}

试试“耳朵”灵不灵?

让我们运行一下,看看它都“听”到了啥:

场景一:你啥也没说

$ cargo run
["target/debug/minigrep"]

探测器回答:“我只听到有人喊我的名字!”

场景二:你下达了指令

$ cargo run -- 寻宝图 地图.txt
["target/debug/minigrep", "寻宝图", "地图.txt"]

这次,袋子(vector)里有三个东西:

  1. "target/debug/minigrep":这是它自己的名字,每次启动都会“听”到。
  2. "寻宝图":这是你要找的“关键词”!
  3. "地图.txt":这是你要搜索的“文件”!

完美!我们的“耳朵”工作正常!

把关键词和文件名“拎”出来

现在,我们知道它能听见了,但还不能用。我们需要把“寻宝图”和“地图.txt”这两个重要的信息,从袋子里拿出来,单独放好。

就像这样:

let query = &args[1];     // 第二个词是“关键词”(索引从0开始,所以是1)
let file_path = &args[2]; // 第三个词是“文件名”

然后,我们可以让探测器“复述”一遍,确认它听懂了:

println!("正在寻找:{}", query);
println!("在文件中:{}", file_path);

运行一下:

$ cargo run -- 寻宝图 地图.txt
正在寻找:寻宝图
在文件中:地图.txt

太棒了! 我们的“寻宝探测器”现在不仅能“听见”指令,还能理解并记住“找什么”和“在哪找”!它的“耳朵”和“大脑”已经连接上了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编码浪子

您的支持将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值