如何在Clap中获取多值参数DIRECTORY并存入向量?
使用Clap(YAML配置)获取传入的目录列表
我来帮你搞定这个问题,其实用Clap结合YAML配置来获取多目录参数很简单,一步步来:
首先,确认你的Cargo.toml里已经加对了Clap的依赖,要包含yaml特性:
[dependencies] clap = { version = "4.0", features = ["yaml"] }
你的YAML配置没问题,接下来在main.rs里这么写就行:
use clap::{Command, ArgMatches}; use std::fs; fn main() { // 先加载你的YAML配置文件 let yaml_content = fs::read_to_string("cli.yml") .expect("读CLI配置文件失败了!"); let cmd = Command::from_yaml(&yaml_content); let matches = cmd.get_matches(); // 初始化存储目录名的向量 let mut dir_names: Vec<&str> = Vec::new(); // 提取所有传入的目录参数 if let Some(dirs) = matches.get_many::<&str>("DIRECTORY") { // 逐个加到向量里,和你想要的操作完全一致 for dir in dirs { dir_names.push(dir); // 这里可以加个调试输出,看看拿到的目录对不对 println!("当前处理目录: {}", dir); } } // 之后你就可以用dir_names做任何你想做的事啦 println!("收集到的所有目录: {:?}", dir_names); }
如果你觉得遍历写法有点啰嗦,也可以用更简洁的方式直接生成向量:
let dir_names: Vec<&str> = matches.get_many::<&str>("DIRECTORY") .unwrap_or_default() .collect();
这里几个关键点要注意:
- 因为你的YAML里把DIRECTORY设为了
multiple: true,所以用get_many方法就能拿到所有传入的目录值,它会返回一个迭代器 - 又因为你设了
required: true,用户不传目录的话,Clap会自动弹出错误提示并退出程序,不用担心get_many返回None的情况,不过用if let或者unwrap_or_default会让代码更健壮
内容的提问来源于stack exchange,提问作者ka s
相关产品推荐
相关产品推荐

