了解 Rust 的 clap v4 箱中的 `default_value_t` 和 `default_missing_value`

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

在使用 Rust 中的 clap crate 构建我的第一个命令行程序的过程中,我对

default_value_t
default_missing_value
属性之间的区别有点困惑。以下代码片段取自 clap 的 Git's Cookbook 文档,以导出 API 为例:

#[derive(Debug, Subcommand)]
enum Commands {
    /// Compare two commits
    Diff {
        #[arg(value_name = "COMMIT")]
        base: Option<OsString>,
        #[arg(value_name = "COMMIT")]
        head: Option<OsString>,
        #[arg(last = true)]
        path: Option<OsString>,
        #[arg(
            long,
            require_equals = true,
            value_name = "WHEN",
            num_args = 0..=1,
            default_value_t = ColorWhen::Auto, // <- This 
            default_missing_value = "always",  // <- and this part.
            value_enum
        )]
        color: ColorWhen,
    },

#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]
enum ColorWhen {
    Always,
    Auto,
    Never,
}

我已经在代码示例中用注释指出了。

据我了解,当参数

default_missing_value
可以采用多个值时,
--foo
似乎很有用。在这种情况下,当未提供值时,它默认为
default_missing_value
设置的值。然而对我来说,
default_value_t
似乎有相同或相似的目的?

有人可以帮助澄清

default_value_t
default_missing_value
之间的区别吗?非常感谢示例。

rust command-line command-line-interface command-line-arguments clap
1个回答
0
投票

所有各种指令都被更广泛地记录为

clap::Arg
的方法。

据我了解,当假设参数 --foo 可以采用多个值时,default_missing_value 似乎很有用。

它与多重值没有任何关系。

但是对我来说,default_value_t 似乎具有相同或相似的目的?

根据上面链接的文档,它们具有相似但不同的目的:

pub fn default_value(self, val: impl IntoResettable<OsStr>) -> Arg

参数不存在时的值。

pub fn default_missing_value(self, val: impl IntoResettable<OsStr>) -> Arg

当标志存在但未指定值时参数的值。

因此,当命令行中的参数

missing
时,会调用default_value[0],例如

git diff

while

default_missing_value
当参数存在但没有值时被调用,例如

git diff --color

对于 git 来说,前者的意思是“遵循配置文件(/ stdout 是否是一个术语)”,而后者的意思是“强制彩色输出”。


[0] 声明式

default_value_t
default_value
本质上映射到同一件事,只是前者是后解析的(例如,它可能是一个数字),而后者是预解析的(它始终是一个字符串文字)。

© www.soinside.com 2019 - 2024. All rights reserved.