【问题标题】:What happens in Rust using "match" if nothing matches?如果没有匹配项,在 Rust 中使用“匹配”会发生什么?
【发布时间】:2013-10-26 18:39:32
【问题描述】:

我正在学习 Rust,它看起来很有趣。我对“匹配”还不是很熟悉,但它看起来是相当完整的。我正在使用以下代码(如下)将 String 转换为 i64,其中包括注释掉的行“None”代替下一行“_”。我想知道在没有下划线的不匹配的情况下会发生什么,或者“无”是否可能是一个包罗万象的东西。调用代码需要正数 i64,因此负数会导致无效输入(在这种情况下)。我不确定是否可以使用此示例在返回中指示错误,而不是使用结构。

  1. 如果没有下划线作为匹配项,“None”是否会全部捕获,可以用它来代替下划线吗?

  2. 这样的函数是否可以在不使用结构体作为返回值的情况下返回错误?

  3. 一般来说,使用“匹配”是否可能出现不匹配,如果是,会发生什么情况?

  4. 在下面的例子中,使用下划线和使用“None”有什么区别吗?

示例代码:

fn fParseI64(sVal: &str) -> i64 {
    match from_str::<i64>(sVal) {
        Some(iVal) => iVal,
//        None => -1
     _ => -1    
    }
}

【问题讨论】:

    标签: rust


    【解决方案1】:
    1. 如果不使用下划线作为匹配项,“None”会全部捕获吗,可以用它来代替下划线吗?

    在这种情况下,是的。 Option&lt;T&gt; 只有 2 种情况:Some&lt;T&gt;None。 您已经为所有值匹配 Some 案例,None 是唯一剩下的案例,所以 None 的行为与 _ 完全相同。

     2. 这样的函数是否可以在不使用结构体作为返回值的情况下返回错误?

    我建议您阅读这份详细指南以了解处理错误的所有可能方法 - http://static.rust-lang.org/doc/master/tutorial-conditions.html

    使用选项和结果将要求您返回一个结构。

     3. 一般来说,是否有可能使用“匹配”进行不匹配,如果是,会发生什么?

    如果 Rust 不能保证所有可能的情况都得到处理,它就不会编译 match。如果您不匹配所有可能性,则需要有一个 _ 子句。

     4. 在下面的示例中,使用下划线和使用“无”有什么区别吗?

    没有。请参阅答案 #1。

    以下是编写函数的多种方式中的 3 种:

    // Returns -1 on wrong input.
    fn alt_1(s: &str) -> i64 {
      match from_str::<i64>(s) {
        Some(i) => if i >= 0 {
          i
        } else {
          -1
        },
        None => -1
      }
    }
    
    // Returns None on invalid input.
    fn alt_2(s: &str) -> Option<i64> {
      match from_str::<i64>(s) {
        Some(i) => if i >= 0 {
          Some(i)
        } else {
          None
        },
        None => None
      }
    }
    
    // Returns a nice message describing the problem with the input, if any.
    fn alt_3(s: &str) -> Result<i64, ~str> {
      match from_str::<i64>(s) {
        Some(i) => if i >= 0 {
          Ok(i)
        } else {
          Err(~"It's less than 0!")
        },
        None => Err(~"It's not even a valid integer!")
      }
    }
    
    fn main() {
      println!("{:?}", alt_1("123"));
      println!("{:?}", alt_1("-123"));
      println!("{:?}", alt_1("abc"));
    
      println!("{:?}", alt_2("123"));
      println!("{:?}", alt_2("-123"));
      println!("{:?}", alt_2("abc"));
    
      println!("{:?}", alt_3("123"));
      println!("{:?}", alt_3("-123"));
      println!("{:?}", alt_3("abc"));
    }
    

    输出:

    123i64
    -1i64
    -1i64
    Some(123i64)
    None
    None
    Ok(123i64)
    Err(~"It's less than 0!")
    Err(~"It's not even a valid integer!")
    

    【讨论】:

    • 谢谢,这看起来很有解释性。我将尝试给出的示例。
    猜你喜欢
    • 2011-07-07
    • 2022-06-20
    • 2012-08-06
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多