如何让 clap 处理具有多个值的单个参数,而不必多次指定标志?

Mar*_*ick 7 rust clap

我想要一个命令,这样do_something --list 1 2 3会导致结构中的字段设置为[1, 2, 3].

以下代码适用于do_something --list 1 --list 2 --list 3

use clap::Parser; // 3.2.8

#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
pub struct Cli {
    #[clap(short, long, value_parser)]
    pub list: Option<Vec<i32>>,
}

fn main() {
    let cli = Cli::parse();
    println!("CLI is {:#?}", cli);
}
Run Code Online (Sandbox Code Playgroud)

当我使用时--list 1 2 3,它给了我错误:

错误:发现参数“2”不是预期的,或者在此上下文中无效

我也尝试过--list "1 2 3"--list 1,2,3但也遇到了错误。

我还能够获得多个值作为位置参数,但不能作为Option带有标志的参数。

--list 1 2 3拍手是支持什么吗?我认为这是由 clap 的多个值支持的。我的设置/代码或命令行输入中是否缺少某些内容?

Pit*_*taJ 12

您正在寻找use_value_delimiter设置。设置use_value_delimiter = true并设置要与 一起使用的实际分隔符value_delimiter = ','

  • 文档链接 -&gt; https://docs.rs/clap/latest/clap/builder/struct.Arg.html#method.value_delimiter (2认同)

Ste*_*Lau 9

在 clap 4.2.7 中,use_value_delimiter已弃用,这意味着接受的答案不再有效,相反,您应该使用num_args = 1..

use clap::Parser; // 4.2.7

#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
pub struct Cli {
    #[clap(short, long, value_delimiter = ' ', num_args = 1..)]
    pub list: Option<Vec<i32>>,
}

fn main() {
    let cli = Cli::parse();
    println!("CLI is {:#?}", cli);
}
Run Code Online (Sandbox Code Playgroud)
$ cargo b
$ ./target/debug/rust --list 1 2 3
CLI is Cli {
    list: Some(
        [
            1,
            2,
            3,
        ],
    ),
}
Run Code Online (Sandbox Code Playgroud)