语法问题:在 match{} 中返回 catch-all 值

Bar*_*ino 3 syntax rust

一个简单的语法问题,但无法谷歌它。

例如,我想编写一个返回值 的函数i,但如果i == 5,它应该返回 0 。可以写成单曲match吗?

fn get_i(i: i32) -> i32 {
    match i {
        5 => 0,
        _ => ???,
    }
}
Run Code Online (Sandbox Code Playgroud)

Lag*_*aer 5

对于您的特定示例,确实有一个更简单的解决方案,正如评论中指出的:

fn get_i(i: 32) -> i32 {
  if i == 5 {
    0
  } else {
    i
  }
}
Run Code Online (Sandbox Code Playgroud)

但假设您有一个更复杂的模式,我想您的问题是在这种情况下如何返回包罗万象的值。

嗯,就模式而言,没有什么特别的_。您也可以使用任何其他符号。所以你可以写

fn get_i(n: i32) -> i32 {
    match n {
        5 => 0,
        i => i,
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果左侧的模式只是一个名称,它将匹配任何内容并将其绑定到该名称。

您可以在左侧使用任何有效的变量名称,然后在模式的右侧使用它。

当您使用 时,也会发生同样的情况,只是按照理解和约定,当以 开头的变量实际上未被使用_时,Rust 不会警告您。_这就是为什么_当它只是为了返回一些与实际输入无关的默认值时经常用于包罗万象的模式,但没有理由不能使用另一个变量名称。