【问题标题】:How to limit an CLI argument to an enum? [duplicate]如何将 CLI 参数限制为枚举? [复制]
【发布时间】:2016-10-22 21:20:50
【问题描述】:

在学习 Rust 并尝试做一些有用的事情时,我正在寻找一个 SAFE API call for DNS:Add service。 API 定义良好,按权利应该是一个简单的 PUT 请求,其主体是多个字符串和一个变量,仅限于两个选项。

我希望为 put 的主体定义一个结构和枚举及其实际限制,而不仅仅是使用字符串;正如我所期望的那样,定义接近现实是更好的做法。

我认为我必须很接近,但随后出现不匹配,试图将输入限制为枚举。第三个参数应该只是 'drive' 或 'app' as RootPathVariant

所以,我希望将 root_patharguments=arg[2] 匹配 但是匹配左侧的atm是&'static str,这是错误的,它想要String

枚举定义:

pub enum RootPathVariant { App, Drive }

impl RootPathVariant {
    pub fn as_str(&self) -> &str {
        match self {
            &RootPathVariant::App => "app",
            &RootPathVariant::Drive => "drive",
        }
    }
}

我应该如何把这个匹配的左边,只接受那个枚举的内容?

let mut root_path: RootPathVariant = RootPathVariant::Drive;
match args[2].to_string() {
    "drive" => { root_path = RootPathVariant::Drive },
    "app" => { root_path = RootPathVariant::App },
    _ => { println!( "Error: root_path not [drive | app]");  return }
};

let put_body = AddServiceBody {
    long_Name: args[0],
    service_Name: args[1],
    root_Path: root_path,
    service_Home_Dir_Path: args[3]
};

感谢您的帮助!

【问题讨论】:

  • 您可以使用string.as_ref()String 中获取&str,然后在比赛中使用它。但是args 的类型是什么?如果您已经拥有&str,则可能不需要to_string()
  • 请添加确切的错误消息和minimal reproducible example。那么你更有可能得到任何答案:)
  • @Pavel Strakhov args 的类型从 Cargo:getopts 作为 Vec 很简单。我错过了match args[2].as_str() 的明显选项,它似乎有效!
  • 我支持@LukasKalbertodt 关于 MCVE 的观点。例如,这个问题 nothing 与枚举有关。我敢打赌your code looks like this

标签: enums rust


【解决方案1】:

注意到答案似乎是match args[2].as_str()

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多