【问题标题】:String Match with Option in RustRust 中带选项的字符串匹配
【发布时间】:2020-04-02 21:19:09
【问题描述】:

我正在尝试将输入与可能的类型相匹配,然后将字符串值转换为数字。我有这样的事情:

fn letter_to_num(nameNum: &str) -> Option<f32> {
    match nameNum {
        Some(num) => {
            "One" => 1.0,
            "Two" => 2.0,
            "Three" => 3.0
        },
        None => println!("Invalid Number"),
    }
}

如果它不能匹配输入,它会返回一个错误。否则,它将与其中一项匹配并在成功时返回Some(num)。我不完全确定将选项语句放在哪里,并且不同的组合似乎也不想编译。我得到的主要错误是:

Expected one of '.', ',', ';', or an operator, found '=>'

【问题讨论】:

    标签: rust


    【解决方案1】:

    首先 - 你在 &amp;str 上进行匹配,而不是 Option,所以你的代码应该看起来更像这样。

    fn letter_to_num(nameNum: &str) -> Option<f32> {
        match nameNum {
            "One" => Some(1.0),
            "Two" => Some(2.0),
            "Three" => Some(3.0),
            _ => None // or panic!("message")
        }
    }
    

    这里的重点:

    • 您需要匹配&amp;str 值并返回Option&lt;f32&gt;,而不匹配Option

    • 您需要从函数(SomeNone)返回正确的值或恐慌。 println! 既不恐慌也不返回正确的类型值。由于好奇心恐慌从技术上讲永远不会返回调用者因此是允许的,它们会中断程序的执行。

    • 匹配时,您需要指定详尽的匹配集,例如_ 之类的通配符就可以了。它基本上说 - 匹配这里的所有内容。所以你把它放在最后。您可以使用变量,例如a 这里例如像这样a =&gt; panic!("Invalid value {}", a)

    只是一些一般性的评论:

    • 在比较输入时考虑大写和小写,您可以通过例如:将输入转换为小写然后匹配,当然除非您只将大写的单词视为正确的单词。

    【讨论】:

      【解决方案2】:

      输入是&amp;str,而不是Option&lt;&amp;str&gt;,所以Some(num) 不会匹配nameNum 的模式。它也应该重命名为name_num,否则你会收到警告。 由于您想在不匹配的字符串上返回错误消息,您可以使用Result

      fn letter_to_num(name_num: &str) -> Result<f32, &str> {
          match name_num {
              "One" => Ok(1.0),
              "Two" => Ok(2.0),
              "Three" => Ok(3.0),
              _ => Err("Invalid Number"),
          }
      }
      

      playground上测试上面的代码。

      【讨论】:

        猜你喜欢
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        相关资源
        最近更新 更多