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

d8tt03nd  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(115)

我希望有一个命令,这样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);
}

当我使用--list 1 2 3时,它给了我错误:
错误:找到了不需要的参数“% 2”,或该参数在此上下文中无效
我也试过--list "1 2 3"--list 1,2,3,但也有错误。
我还可以获得多个值作为位置参数,但不能作为带标志的Option
clap支持--list 1 2 3吗?我认为这是由clap的多重价值观支持的。我的设置/代码或命令行输入中是否缺少了什么?

hujrc8aj

hujrc8aj1#

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

f87krz0w

f87krz0w2#

在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);
}
$ cargo b
$ ./target/debug/rust --list 1 2 3
CLI is Cli {
    list: Some(
        [
            1,
            2,
            3,
        ],
    ),
}

相关问题