rust 为什么使用clap 4时这个分支总是true?

g0czyy6m  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(209)

我想有一个命令行在Rust使用clap 4允许这一点:

app --wait

如果--wait存在,则启动函数。如果不存在,则不执行任何操作。
我正在尝试下面的代码,但没有成功:if command.contains_id("wait")始终为真!使用或不使用--wait作为参数,为什么?

let command = Command::new("")
    .arg(
        Arg::new("wait")
            .long("wait")
            .required(false)
            .num_args(0)
            .help("Wait..."),
    )
    .get_matches();

if command.contains_id("wait") {
    do_wait().await;
}
b1zrtrql

b1zrtrql1#

来自default_value的clap4文档:
参数不存在时的值。
注:如果用户在运行时不使用此参数,ArgMatches::contains_id仍将返回true。如果要确定在运行时是否使用了此参数,请考虑ArgMatches::value_source。
所以看起来default_value起作用了。为什么?我不是很确定,但是看起来Arg::new使用了Arg::default的默认值。这默认default_vals为一个空vec,这在num_args(0)之外的任何东西上都不起作用,但是在你没有参数的情况下确实起作用。
因此,您的解决方案似乎是使用value_source而不是contains_id,但是您不应该像这样使用num_args。
改为使用.action(ArgAction::SetTrue),如下所示:

Arg::new("wait")
                .long("wait")
                .action(ArgAction::SetTrue)
                .help("Wait ...")

请参阅此处的标志部分了解更多详细信息。

相关问题