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

Bri*_* Oh 7 rust

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

  1. 没有下划线作为匹配项,"无"会捕获所有,是否可以使用而不是下划线?

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

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

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

示例代码:

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

Dog*_*ert 8

  1. 没有下划线作为匹配项,"无"会捕获所有,是否可以使用而不是下划线?

在这种情况下,是的.只有2个案例Option<T>:Some<T>None.您已经匹配Some所有值的大小写,None是唯一的左侧情况,因此 None行为与完全相同_.

 2.如果不使用结构作为返回值,是否可以在这样的函数中返回错误?

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

使用选项和结果将要求您返回结构.

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

match如果不能保证处理所有可能的情况,Rust将不会编译._如果你没有匹配所有可能性,你需要有一个条款.

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

不,请参阅答案#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"));
}
Run Code Online (Sandbox Code Playgroud)

输出:

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