Rust 写一个简易 CLI 小工具
Rust 写一个简易 CLI 小工具
关于学习了 Rust 一些基础语法,想写一个 demo 来巩固一下基础的语法知识,想到了可以写一个 CLI 小工具。
大致思路
- cli 工具如执行
cli --help
可以打印出命令、参数帮助。 - cli 工具的参数可能不止一个 如
cli --hi NAME
,打印的结果应该是hi 你的名字
。
这就是一个简单的 cli 工具的实现,我们会且仅用到标准库,如果觉得功能不够,可以自行添加,如 执行一个命令 可以往 Windows 的 HOST 添加内容,就需要用到 Rust 的 I/O。
开始实现
- 导包
首先我们导入标准库,我们会用到 std::env
下的 Args 结构体,它是 进程参数的迭代器,为每个参数产生 String
值。
use std::env;
fn main() {
}
- 定义 Help 内容
let help: &str = r#"
cli
--help 帮助,查看所有参数。
--version 查看版本。
--hi NAME 向你打招呼。
"#
// 这里我们使用 r#""# 不仅方便更巩固 Rust 字符串相关的知识点。
- 程序参数迭代器的使用
let args: Vec<String> = env::args().collect();
此处我们声明一个名为 agrs ,值为String类型的向量,因为迭代器返回的是一串 String 类型的内容。
.collect()
方法就是去收集这些参数。
- 开始匹配参数
for arg: &String in args.iter() {
match arg.as_str() {
"--help" => {
println!("{}", help);
return;
},
"--version" => {
println!("当前 cli 版本:{}", env!("CARGO_PKG_VERSION"));
return;
},
_ => {
//
}
}
}
println!("未能识别的参数!可以输入 `cli --help` 获取帮助。")
我们来逐一分析一下,
for arg: &String in args.iter()
,定义一个 for 循环。match arg.as_str()
让我们 for 循环的 arg 参数开始逐一匹配一下内容,如果是 --help 就打印我们的帮助信息。env!("CARGO_PKG_VERSION")
是一个宏,目的是我们可以打印 关于项目配置里面的版本号。- 在 for 循环外打印出错误信息,原因是没有相关匹配的参数。
- 两个参数
"--hi" => {
if let Some(name) = args.get(2) {
println!("hi {}", name);
return;
} else {
println!("错误:--hi 需要且仅需要一个名字参数");
return;
}
}
- 我们的
if let Some(name) = args.get(2)
- 是用 Some 这个枚举类型,简单来说就是 声明一个变量,要么有值:Some(T),要么为空:None。这是Rust用来替代空指针不安全性的一个特性,非常好用。
args.get(2)
我们的 args 是迭代器返回的所有参数,而如果你把这个 args 全部打印出来的话会发现,第一个参数是程序运行的地址,第二个是--hi
这个参数,第三个才是NAME
参数,所以我们使用.get(2)
方法,让它去获取这个数组的第三个元素,也就是索引 2。
源码展示
use std::env;
fn main() {
let help: &str = r#"
cli
--help 帮助,查看所有参数。
--version 查看版本。
--hi NAME 向你打招呼。
"#
// println!("{}", help);
let args:Vec<String> = env::args().collect();
for arg in args.iter() {
match arg.as_str() {
"--help" => {
println!("{}", help);
return;
},
"--version" => {
println!("当前 cli 版本: {}", env!("CARGO_PKG_VERSION"));
return;
},
"--hi" => {
if let Some(name) = args.get(2) {
println!("hi {}", name);
return;
} else {
println!("错误:--hi 需要且仅需要一个名字参数");
return;
}
},
_ => {
//
}
}
}
println!("未能识别的参数!可以输入 `cli --help` 来获取帮助。");
}
转载自:https://juejin.cn/post/7370356693593849856