如果没有匹配,在Rust中使用“匹配”会发生什么?

时间:2013-10-26 09:17:40

标签: rust

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

  1. 如果没有下划线作为匹配项,“无”会捕获全部,是否可以使用而不是下划线?

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

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

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

  5. 示例代码:

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

1 个答案:

答案 0 :(得分:8)

  
      
  1. 如果没有下划线作为匹配项,“无”会捕获所有内容,是否可以使用而不是下划线?
  2.   

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

  

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

我建议您阅读此详细指南,了解处理错误的所有可能方法 - 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!")