在使用 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
之间的区别吗?非常感谢示例。
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
本质上映射到同一件事,只是前者是后解析的(例如,它可能是一个数字),而后者是预解析的(它始终是一个字符串文字)。