'if'在模式匹配中的位置差异

时间:2014-01-20 16:17:40

标签: scala if-statement pattern-matching

以下两种模式匹配方式之间是否存在差异:

foo match {
case a if(cond) => println("bar")
case a => println("baz")
case _ => println("default") 
}

foo match {
case a => if (cond) println("bar") else println("baz")
case _ => println("default") 
}

2 个答案:

答案 0 :(得分:3)

就你想要完成的事而言,没有区别。但从语义上讲,你实际上在做什么是不同的。

在第一种情况下,您有一个带后卫后缀的模式(条件)。仅当案例中的模式匹配时,才会对进行评估。如果guard表达式的计算结果为true,则模式匹配成功。

在第二种情况下,当案例中的模式匹配时,执行部分功能。在该部分函数体内是一个条件,这就像任何具有条件的函数体一样。

有关模式匹配的详细信息,请查看Scala Language Specification的第8.4节。这很吸引人。

最后,请注意您的示例都会产生错误或警告(取决于Scala版本),因为默认值无法访问。我知道这只是一个人为的例子,但只是说'。

答案 1 :(得分:1)

规范中的8.4表示对表达式的评估可能不是文本顺序,这就是为什么警卫不应该是副作用的。

因此,如果您的条件测试是副作用,请不要将它放在警卫中。