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

Raf*_*ann 3 rust

这对Rust来说是一个不错的fizzbuzz我认为:

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

它也可以这样说:

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),
}
Run Code Online (Sandbox Code Playgroud)

现在那让我很困惑.

i if i % 3 == 0
Run Code Online (Sandbox Code Playgroud)

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

mal*_*rbo 8

现在那让我很困惑.

i if i % 3 == 0
Run Code Online (Sandbox Code Playgroud)

是一种表达,对吗?

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

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),
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样读取匹配表达式

  • 如果i模式匹配x(它总是匹配和i值被移动(复制)到x)和x % 3 == 0x % 5 == 0然后println!("FizzBuzz"); 其他
  • 如果i模式匹配xx % 3 == 0然后println!("Fizz"); 其他
  • 如果i模式匹配xx % 5 == 0然后println!("Buzz"); 其他
  • println!("{}", x)