派生 API
从结构体生成参数
派生 API 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
derive API
derive API 允许您将 CLI 描述为结构体,并通过 #[derive(Parser)] 让 clap 生成解析器。
- 比构建器 API 所需的样板代码更少
- 类型安全:字段会成为具有明确类型的值
使用 derive 功能启用它。
最小 Parser 结构体
为结构体添加 #[derive(Parser)],并在 main 中调用 Cli::parse()。每个字段对应一个参数。
use clap::Parser;
#[derive(Parser)]
struct Cli {
name: String,
}
fn main() {
let cli = Cli::parse();
println!("Hello, {}!", cli.name);
}字段变为位置参数
像 name: String 这样的普通字段是必需的位置参数。字段名会成为它的值名称。
use clap::Parser;
#[derive(Parser)]
struct Cli {
input: String,
output: String,
}可选字段
将字段包装在 Option 中即可使其变为可选字段。如果用户省略该字段,您会得到 None。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(short, long)]
config: Option<String>,
}标志以及短选项和长选项
#[arg(short, long)] 属性会根据字段名生成 -v 和 --verbose。bool 字段会成为开关。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(short, long)]
verbose: bool,
}具有类型的值
clap 会按照字段的类型进行解析。u32 字段会自动拒绝非数字输入。
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[arg(short, long, default_value_t = 1)]
count: u32,
}对已解析的 Cli 建模
解析完成后,Cli 结构体就是普通数据。这个可运行版本展示了解析后如何使用这些字段。
struct Cli {
name: String,
count: u32,
verbose: bool,
}
fn main() {
let cli = Cli { name: "Alice".to_string(), count: 2, verbose: true };
for _ in 0..cli.count {
println!("Hello, {}! (verbose={})", cli.name, cli.verbose);
}
}使用枚举表示子命令
使用 derive API 时,带有 #[derive(Subcommand)] 的枚举可以表示子命令。每个变体都是一个命令。
use clap::{Parser, Subcommand};
#[derive(Parser)]
struct Cli {
#[command(subcommand)]
cmd: Commands,
}
#[derive(Subcommand)]
enum Commands {
Add { task: String },
List,
}匹配枚举子命令
调用 Cli::parse() 后,匹配枚举来进行分发。变体数据可以简洁地解构。
use clap::Parser;
fn run(cli: Cli) {
match cli.cmd {
Commands::Add { task } => println!("add {}", task),
Commands::List => println!("list"),
}
}通过 command 属性设置元数据
将 #[command(name, version, about)] 放在结构体上,以设置 CLI 元数据。version 可以自动从 Cargo 读取。
use clap::Parser;
#[derive(Parser)]
#[command(name = "greet", version, about = "Greets people")]
struct Cli {
name: String,
}演示枚举分发
匹配枚举的模式是 derive 子命令的核心。下面是使用独立 Rust 代码表达相同思想的示例。
enum Command {
Add(String),
List,
}
fn main() {
let cmd = Command::Add("Write code".to_string());
match cmd {
Command::Add(task) => println!("Added: {}", task),
Command::List => println!("Listing"),
}
}快速检查
测试您对 derive API 的理解。
总结
derive API 会将结构体转换为解析器:
#[derive(Parser)]加上Cli::parse()- 普通字段是位置参数;
Option会使它们变为可选参数 #[arg(short, long)]会生成标志和选项- 带有
#[derive(Subcommand)]的枚举可以表示子命令
下一步:进行验证并完善帮助输出。
常见问题解答
「派生 API」课时是免费的吗?
是的 — 「派生 API」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「派生 API」这节课中我会学到什么?
从结构体生成参数 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「派生 API」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。