0Pricing
Learn Rust Coding · 课时

派生 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. clap 基础
  2. 子命令
  3. 派生 API
  4. 验证与帮助信息
← 返回 Learn Rust Coding