首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在结构中使用枚举?

如何在结构中使用枚举?
EN

Stack Overflow用户
提问于 2019-02-14 09:46:36
回答 4查看 5.8K关注 0票数 12

我想让StructOpt与枚举一起工作,这样每当用户传递-d sunday时,它都被解析为Day::Sunday

代码语言:javascript
复制
#[macro_use]
extern crate structopt;

use std::path::PathBuf;
use structopt::StructOpt;

// My enum
enum Day {
    Sunday, Monday
}

#[derive(Debug, StructOpt)]
#[structopt(name = "example", about = "An example of StructOpt usage.")]
struct Opt {
    /// Set speed
    #[structopt(short = "s", long = "speed", default_value = "42")]
    speed: f64,
    /// Input file
    #[structopt(parse(from_os_str))]
    input: PathBuf,
    /// Day of the week
    #[structopt(short = "d", long = "day", default_value = Day::Monday)]
    day: Day,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:?}", opt);
}

我目前最好的解决方案是使用Option<String>作为类型并传递自定义parse_day()

代码语言:javascript
复制
fn parse_day(day: &str) -> Result<Day, ParseError> {
    match day {
        "sunday" => Ok(Day::Sunday),
        _ => Ok(Day::Monday)
    }
    Err("Could not parse a day")
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-14 10:09:49

Struct接受实现FromStr的任何类型,这些类型离您的parse_day函数不远:

代码语言:javascript
复制
use std::str::FromStr;

// any error type implementing Display is acceptable.
type ParseError = &'static str;

impl FromStr for Day {
    type Err = ParseError;
    fn from_str(day: &str) -> Result<Self, Self::Err> {
        match day {
            "sunday" => Ok(Day::Sunday),
            "monday" => Ok(Day::Monday),
            _ => Err("Could not parse a day"),
        }
    }
}

此外,default_value应该是一个字符串,它将被解释为使用from_strDay

代码语言:javascript
复制
#[structopt(short = "d", long = "day", default_value = "monday")]
day: Day,
票数 26
EN

Stack Overflow用户

发布于 2019-09-30 15:57:59

@kennytm方法可以工作,但是arg_enum!宏是一种更简洁的方法,如structopt所示

代码语言:javascript
复制
arg_enum! {
    #[derive(Debug)]
    enum Day {
        Sunday,
        Monday
    }
}

#[derive(StructOpt, Debug)]
struct Opt {
    /// Important argument.
    #[structopt(possible_values = &Day::variants(), case_insensitive = true)]
    i: Day,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:?}", opt);
}

这将允许您将工作日解析为Sundaysunday

票数 19
EN

Stack Overflow用户

发布于 2019-02-14 10:10:38

错误信息是:

代码语言:javascript
复制
error[E0277]: the trait bound `Day: std::str::FromStr` is not satisfied
  --> src/main.rs:22:17
   |
22 | #[derive(Debug, StructOpt)]
   |                 ^^^^^^^^^ the trait `std::str::FromStr` is not implemented for `Day`
   |
   = note: required by `std::str::FromStr::from_str`

您可以按照消息的建议,通过实现FromStr for Day (参见kennytm的回答)或为Day定义一个解析函数来解决这一问题。

代码语言:javascript
复制
fn parse_day(src: &str) -> Result<Day, String> {
    match src {
        "sunday" => Ok(Day::Sunday),
        "monday" => Ok(Day::Monday),
        _ => Err(format!("Invalid day: {}", src))
    }
}

并使用try_from_str属性指定它:

代码语言:javascript
复制
/// Day of the week
#[structopt(short = "d", long = "day", parse(try_from_str = "parse_day"), default_value = "monday")]
day: Day,
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54687403

复制
相关文章

相似问题

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