如果匹配臂中的表达式返回false会发生什么?

时间:2016-07-21 19:02:41

标签: rust

在Rust中,这将是一个不错的fizzbuzz:我想:

match (i % 3, i % 5) {
    (0, 0) => println!("FizzBuzz"),
    (0, _) => println!("Fizz"),
    (_, 0) => println!("Buzz"),
    _ => println!("{}", i),
}   

也可以这样说:

match i {
    i if i % 3 == 0 && i % 5 == 0 => println!("FizzBuzz"),
    i if i % 3 == 0 => println!("Fizz"),
    i if i % 5 == 0 => println!("Buzz"),
    _ => println!("{}", i),
}

现在让我感到困惑。

i if i % 3 == 0

是一个表达,对吗?因此,当条件为真时,这将评估为i。但如果它是假的会发生什么?

3 个答案:

答案 0 :(得分:8)

  

现在让我感到困惑。

i if i % 3 == 0
     

是一个表达,对吧?

不,不是。这是一个带有guardi)的模式(i % 3 == 0)。也许你感到困惑,因为你使用了相同的绑定名称。考虑这个修改过的例子:

match i {
    x if x % 3 == 0 && x % 5 == 0 => println!("FizzBuzz"),
    x if x % 3 => println!("Fizz"),
    x if x % 5 => println!("Buzz"),
    _ => println!("{}", x),
}

您可以像这样阅读匹配表达式

  • 如果i与模式x匹配(它始终匹配,i值被移动(复制)到x)和x % 3 == 0以及{{1然后x % 5 == 0;其他
  • 如果println!("FizzBuzz")与模式ix匹配,那么x % 3 == 0;其他
  • 如果println!("Fizz")与模式ix匹配,那么x % 5 == 0;其他
  • println!("Buzz")

答案 1 :(得分:2)

如果为假,则不会调用匹配臂。这些在比赛声明中称为后卫。您可以在the book中了解它们。

它们与if-else 类似,但在存在else块的情况下则不然。他们只是为匹配块添加了更多过滤。

答案 2 :(得分:2)

  

i if i % 3是一个表达式,对吧?

不,不是。 i if i % 3 == 0是一种模式,由简单模式i和模式保护if i % 3 == 0组成。模式保护是关键字if,后跟布尔表达式。它可以在任何简单模式之后出现(其中“简单模式”是指任何尚未具有模式防护的模式)。

如果带有附加图案防护的图案匹配,则将评估图案防护。如果计算结果为true,则将执行关联的分支。否则,将调用下一个模式,就好像模式不匹配一样。