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

标签 rust command-line-arguments clap

我希望一个论点暗示另一个论点,尽管它们不采用明确的值。 --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,

看起来默认值实现使用与相同的代码,所以如果您禁用一个,就会禁用另一个。

关于rust - 如何在不需要显式值的情况下使一个论点暗示另一个论点? (--foo,不是--foo true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70718779/

相关文章:

rust - 如何通过拍手使用未指定的参数

java - java 帮助中的命令行参数

rust - 在Clap中的参数中采用多个值

performance - 在 Rust 中用零值初始化结构体向量

sorting - 为什么 Rust 不通过 f64 和 f32 的 Ord 特性实现总排序?

python-3.x - 如何将命令行 "key=value"args 转换为字典?

java - 如何在 Java 中询问用户提示后添加分号或冒号之类的内容

rust - Rust:使用拍手来分析用户输入的字符串,以进行命令行编程

rust - 预期引用,找到结构

rust - 闭包是 `FnOnce`,因为它将变量 `________` 移出其环境