如何在不需要显式值的情况下使一个参数暗示另一个参数? (--foo,不是 --foo true)

问题描述 投票:0回答:2

我希望一个参数暗示另一个参数,尽管它们不采用明确的值。

--simple-anime
--complex-anime
应暗示
--anime
。应该起作用的 API 是
default_value_ifs
,表示如果存在前者,则
--anime
也将为 true。问题是该选项打开了
takes_value
,如果我关闭它,则暗示不会发生。

简单的例子:

--dog
意味着
--mammal
。两者都不应该需要一个值——如果参数存在则为真。

use clap::Parser;

fn main() {
    let args = Args::parse_from(["prog-name", "--dog"]);
    assert_eq!(args.dog, true);
    assert_eq!(args.mammal, true);
    dbg!(&args);
    
    let args = Args::try_parse_from(["prog-name", "--mammal"]);
    dbg!(&args);
    assert!(matches!(args, Ok(_)));
}


#[derive(Parser, Debug)]
#[clap()]
struct Args {
    //#[clap(long, default_value_if("dog", None, Some("true")), takes_value(false))]
    #[clap(long, default_value_if("dog", None, Some("true")))]
    mammal: bool,

    #[clap(long)]
    dog: bool,
}

在 Rust Playground 中尝试一下:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4855a88381f65cef8d07f7eab4d41e78

rust command-line-arguments clap
2个回答
4
投票

代替

takes_value(false)
使用
min_values(0)
游乐场):

#[clap(long, default_value_if("dog", None, Some("true")), min_values(0))]
    mammal: bool,

看起来默认值实现使用与 values 相同的代码,因此如果禁用其中一个,就会禁用另一个。


0
投票

@rodrigo 发布的 answer 不再适用于当前版本的 clap (4.4.0)。我修好了:(游乐场)

    #[clap(long, default_value_if("dog", IsPresent, Some("true")))]
    mammal: bool,
© www.soinside.com 2019 - 2024. All rights reserved.