在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
。但如果它是假的会发生什么?
答案 0 :(得分:8)
现在让我感到困惑。
i if i % 3 == 0
是一个表达,对吧?
不,不是。这是一个带有guard(i
)的模式(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")
与模式i
和x
匹配,那么x % 3 == 0
;其他println!("Fizz")
与模式i
和x
匹配,那么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,则将执行关联的分支。否则,将调用下一个模式,就好像模式不匹配一样。