使用 clap 迭代位置参数

tsh*_*ang 8 rust clap

假设我有以下命令行:

./app foo bar baz
Run Code Online (Sandbox Code Playgroud)

我想从中取出这个数组:

["foo", "bar", "baz"]
Run Code Online (Sandbox Code Playgroud)

鉴于位置参数可以是任意计数,有没有办法在 clap 中做到这一点?

H2O*_*H2O 8

您正在寻找的函数是values_of,您可以像这样使用它:

let matches = App::new("My Super Program")
        .arg(Arg::with_name("something")
            .multiple(true))
        .get_matches();

let iterator = matches.values_of("something");
for el in iterator.unwrap() {
    println!("{:?}", el);
};
Run Code Online (Sandbox Code Playgroud)

如果您不关心保留无效的 UTF-8,更简单的选择是使用values_of_lossy,它返回实际的 Vector ( Option<Vec<String>>) 而不是迭代器。

let arguments = matches.values_of_lossy("something").unwrap();      
println!("{:?}", arguments);
Run Code Online (Sandbox Code Playgroud)

请记住,您真的不应该在实际程序中解开这些值,因为如果不提供参数,它只会在运行时崩溃。唯一的例外required(true)是设置的参数。它们的缺失会在调用get_matches.

  • @EliazBobadilla:如果您要编辑代码以匹配 clap 3,您可能还应该调整 doc.rs 的链接。但我认为拥有两个版本的代码会很好。也许发布一个单独的答案? (2认同)