首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructOpt -如何为Vec提供默认值?

StructOpt -如何为Vec提供默认值?
EN

Stack Overflow用户
提问于 2020-08-26 14:56:25
回答 2查看 947关注 0票数 1

我正在寻找一种方法来初始化一个默认的多个项目的structopt Vec字段。我可以使用以下命令对单个项目执行此操作:

代码语言:javascript
复制
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"]);
}

但是,假设默认情况下是vec!["foo", "bar"],那么如何使cli.foo相等呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-26 16:52:39

我遵循了L. Riemer的建议,似乎只实现FromStr就足够了:

代码语言:javascript
复制
use structopt::StructOpt;

#[derive(Debug, PartialEq)]
struct Foo(Vec<String>);

impl std::str::FromStr for Foo {
    type Err = Box<dyn std::error::Error>;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(Foo(s.split(",").map(|x| x.trim().to_owned()).collect()))
    }
}

#[derive(StructOpt)]
pub struct Cli {
    #[structopt(long, default_value = "foo, bar")]
    foo: Foo,
}

fn main() {
    let cli = Cli::from_iter(Vec::<String>::new());
    assert_eq!(cli.foo, Foo(vec!["foo".into(), "bar".into()]));

    let cli = Cli::from_iter(vec!["", "--foo", "foo"]);
    assert_eq!(cli.foo, Foo(vec!["foo".into()]));

    let cli = Cli::from_iter(vec!["", "--foo", "foo,bar,baz"]);
    assert_eq!(cli.foo, Foo(vec!["foo".into(), "bar".into(), "baz".into()]));
}
票数 1
EN

Stack Overflow用户

发布于 2020-08-26 15:30:58

我不认为您可以做到这一点:虽然StructOpt有一些关于默认值的技巧,但我希望这仍然以在命令行界面解析中注入默认值结束,就好像它是显式提供的一样,这意味着可能没有方法提供多个默认值(尽管我肯定是错的)。

您可能希望在应用程序级别处理此问题,例如,在解析完命令行界面后,立即检查foo的一致性,如果为空,则更新它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63592103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档