gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:47:55 24 4
gpt4 key购买 nike

我正在寻找一种方法来初始化 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"]默认情况下?

最佳答案

我已经听从了 L. Riemer 的建议,似乎实现 FromStr 就足够了。只要:

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()]));
}

关于rust - StructOpt - 如何为 Vec 提供默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63592103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com