验证与帮助信息
完善 CLI
验证与帮助信息 是 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 反馈 — 无需本地设置。