【发布时间】:2020-08-26 06:56:24
【问题描述】:
我正在寻找一种方法来默认使用多个项目初始化 structopt Vec 字段。我可以为单个项目做到这一点:
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
pub struct Cli {
#[structopt(default_value = "foo")]
foo: Vec<String>,
}
fn main() {
let cli = Cli::from_iter(Vec::<String>::new());
assert_eq!(cli.foo, vec!["foo"]);
}
但是如何使cli.foo 等于默认情况下假设vec!["foo", "bar"]?
【问题讨论】:
-
你可以通过显式实现
Default来为成员的包装类型实现这一点,参见docs。据我所知,您需要自己实现 Display 和朋友(FromStr,ToString,...)。 -
@L.Riemer 谢谢,
FromStr似乎就足够了(作为答案发布) -
这与我的想法有点不同,不过应该也可以。
-
@L.Riemer 有时间你会发布解决方案吗?我是 rust 新手,所以我可能遗漏了一些东西。
-
完全没有必要这样做。您的解决方案很好,并且定义明确。实现
FromStr告诉编译器如何将(default_value = "foo,bar", long)中的"foo,bar"转换为包装器类型(以及如何从cli 解析)。相反,我会为包装器类型编写(default_value, long)并实现Default,但这是个人喜好问题。顺便说一句,你可以接受你的答案。