如何在不需要显式值的情况下使一个论点暗示另一个论点? (--foo,不是--foo true)
How to make one argument imply another without needing an explicit value? (--foo, not --foo true)
我希望一个论点暗示另一个论点,尽管它们不采用明确的值。 --simple-anime
或 --complex-anime
应暗示 --anime
。应该起作用的 API 是 default_value_ifs
,表示如果存在前者中的任何一个,则 --anime
也将为真。问题是该选项打开 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
而不是 takes_value(false)
使用 min_values(0)
(playground):
#[clap(long, default_value_if("dog", None, Some("true")), min_values(0))]
mammal: bool,
看起来默认值实现使用与 值 相同的代码,所以如果禁用一个,就会禁用另一个。
我希望一个论点暗示另一个论点,尽管它们不采用明确的值。 --simple-anime
或 --complex-anime
应暗示 --anime
。应该起作用的 API 是 default_value_ifs
,表示如果存在前者中的任何一个,则 --anime
也将为真。问题是该选项打开 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
而不是 takes_value(false)
使用 min_values(0)
(playground):
#[clap(long, default_value_if("dog", None, Some("true")), min_values(0))]
mammal: bool,
看起来默认值实现使用与 值 相同的代码,所以如果禁用一个,就会禁用另一个。