语法问题:return 匹配中的全部值{}

Syntax question: return catch-all value in match{}

一个简单的语法问题,但是google不会。

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

fn get_i(i: i32) -> i32 {
    match i {
        5 => 0,
        _ => ???,
    }
}

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

fn get_i(i: 32) -> i32 {
  if i == 5 {
    0
  } else {
    i
  }
}

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

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

fn get_i(n: i32) -> i32 {
    match n {
        5 => 0,
        i => i,
    }
}

之所以可行,是因为如果左侧的模式只是一个名称,它将匹配 任何内容 并将其绑定到该名称。

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

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