Rust命令行参数解析:clap库使用指南

简介

clap (Command Line Argument Parser) 是Rust生态系统中最流行的命令行参数解析库之一。它提供了直观的API和丰富的功能,使得构建命令行应用变得简单。

基本使用

1. 添加依赖

1
2
[dependencies]
clap = "2.33"

2. 创建命令行应用

1
2
3
4
5
6
7
8
use clap::{App, Arg};

fn main() {
let app = App::new("blockchain-demo") // 应用名称
.version("0.1") // 版本号
.author("Your Name") // 作者信息
.about("区块链演示程序"); // 应用描述
}

3. 添加子命令

1
2
3
4
5
6
7
8
9
let app = App::new("blockchain-demo")
.version("0.1")
.author("Your Name")
.about("区块链演示程序")
.subcommand(App::new("printchain")) // 添加无参数子命令
.subcommand(
App::new("addblock") // 添加带参数子命令
.arg(Arg::from_usage("<data> 'the blockchain data'"))
);

4. 解析参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
let matches = app.get_matches();

// 检查子命令
match matches.subcommand() {
("printchain", Some(_)) => {
// 处理printchain命令
println!("打印区块链");
}
("addblock", Some(add_matches)) => {
// 获取data参数
if let Some(data) = add_matches.value_of("data") {
println!("添加区块: {}", data);
}
}
_ => println!("未知命令"),
}
}

参数处理方法

1. 检查子命令

1
2
3
if let Some(ref matches) = matches.subcommand_matches("addblock") {
// 处理addblock子命令
}

2. 获取参数值

1
2
3
if let Some(value) = matches.value_of("参数名") {
// 使用参数值
}

3. 获取多值参数

1
2
3
4
5
if let Some(values) = matches.values_of("参数名") {
for value in values {
// 处理每个值
}
}

命令行使用示例

查看帮助

1
cargo run -- --help

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
blockchain-demo 0.1
Your Name
区块链演示程序

USAGE:
blockchain-demo [SUBCOMMAND]

FLAGS:
-h, --help Prints help information
-V, --version Prints version information

SUBCOMMANDS:
addblock
help Prints this message or the help of the given subcommand(s)
printchain

执行子命令

1
2
3
4
5
# 打印区块链
cargo run -- printchain

# 添加区块
cargo run -- addblock "这是第一个区块的数据"

高级特性

1. 参数验证

1
2
3
4
5
6
7
8
9
.arg(Arg::with_name("count")
.short("c")
.long("count")
.takes_value(true)
.validator(|s| {
s.parse::<i32>()
.map(|_| ())
.map_err(|_| String::from("必须是数字"))
}))

2. 默认值

1
2
3
.arg(Arg::with_name("name")
.long("name")
.default_value("default"))

3. 参数组

1
2
3
.args_group(ArgGroup::with_name("group")
.args(&["arg1", "arg2"])
.required(true))