Learn Rust Coding · 课时

验证与帮助信息

完善 CLI

第 4 / 4 课13 个步骤

验证与帮助信息 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

完善您的 CLI

优秀的 CLI 会尽早验证输入,并提供清晰的帮助信息。clap 通过属性和值解析器同时支持这两点。

  • 以友好的消息拒绝无效值
  • 为每个参数编写说明

值范围

使用 value_parser 将数值参数限制在某个范围内。超出范围的输入会自动被拒绝。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(long, value_parser = clap::value_parser!(u16).range(1..=65535))]
    port: u16,
}

枚举选项

使用 #[derive(ValueEnum)] 将参数限制为一组固定的字符串。

use clap::{Parser, ValueEnum};

#[derive(Clone, ValueEnum)]
enum Mode { Fast, Safe }

#[derive(Parser)]
struct Cli {
    #[arg(long, value_enum)]
    mode: Mode,
}

自定义验证函数

向 value_parser 传入一个返回 Result 的函数。clap 会将 Err 转换为用法错误。

fn parse_even(s: &str) -> Result<u32, String> {
    let n: u32 = s.parse().map_err(|_| "not a number".to_string())?;
    if n % 2 == 0 { Ok(n) } else { Err("must be even".to_string()) }
}

尝试验证逻辑

验证函数就是普通的 Rust 代码。运行它,看看偶数/奇数检查如何返回 Ok 或 Err。

fn parse_even(s: &str) -> Result<u32, String> {
    let n: u32 = s.parse().map_err(|_| "not a number".to_string())?;
    if n % 2 == 0 { Ok(n) } else { Err("must be even".to_string()) }
}

fn main() {
    println!("{:?}", parse_even("4"));
    println!("{:?}", parse_even("7"));
}

必需组和冲突

表达参数之间的关系。conflicts_with 会阻止同时使用两个互不兼容的标志。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(long)]
    quiet: bool,
    #[arg(long, conflicts_with = "quiet")]
    verbose: bool,
}

每个字段的帮助文本

字段上方的文档注释会成为它的帮助文本。这是编写参数说明的惯用方式。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    /// The file to process
    input: String,
}

长帮助与短帮助

clap 会为 -h 显示简短摘要,并为 --help 显示完整文本。如有需要,可使用 #[arg(short_help, long_help)] 将两者分开。

use clap::Parser;

#[derive(Parser)]
struct Cli {
    #[arg(long, long_help = "A detailed explanation shown only with --help")]
    flag: bool,
}

从 main 返回 Result

对于解析后的运行时错误,可以让 main 返回 Result。? 运算符会传播错误,而不依赖 clap 的程序会以非零退出代码打印这些错误。

fn main() -> Result<(), String> {
    let value = "42";
    let n: i32 = value.parse().map_err(|_| "bad number".to_string())?;
    println!("parsed {}", n);
    Ok(())
}

自定义错误样式

clap 会自动格式化用法错误,但您也可以使用 clap::Error 和 cmd.error() 创建适合具体情境的消息。

use clap::{CommandFactory, Parser};

#[derive(Parser)]
struct Cli { value: i32 }

fn fail() {
    let mut cmd = Cli::command();
    cmd.error(clap::error::ErrorKind::ValueValidation, "value too large").exit();
}

使用普通 Rust 总结验证

CLI 验证的本质是检查一个值并报告清晰的错误。下面展示完整流程。

fn validate_port(p: u32) -> Result<u32, String> {
    if (1..=65535).contains(&p) { Ok(p) }
    else { Err(format!("port {} out of range", p)) }
}

fn main() {
    match validate_port(8080) {
        Ok(p) => println!("using port {}", p),
        Err(e) => eprintln!("error: {}", e),
    }
}

快速检查

测试您对验证和帮助信息的理解。

总结

现在您可以构建完善的 CLI:

  • value_parser 强制执行范围和自定义规则
  • ValueEnum 限制可选值
  • conflicts_with 表示互不兼容的标志
  • 文档注释会成为帮助文本
  • 让 main 返回 Result 来处理运行时错误

clap 课程到此完成。

免费开始

用 AI 导师学习 Rust — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「验证与帮助信息」课时是免费的吗?

是的 — 「验证与帮助信息」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「验证与帮助信息」这节课中我会学到什么?

完善 CLI 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「验证与帮助信息」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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