我对java中的scala相当新,对模式匹配也很新。我试图解决的一个问题是何时使用它以及它的成本/收益是什么。例如这个
def myThing(a: Int): Int = a match {
case a: Int if a > 0 => a
case _ => myThing(a + 1)
}
与此相同(除非我真的误解了某些事情)
def myThing(a: Int): Int = {
if (a > 0) a
else myThing(a + 1)
}
所以我的实际问题是: 但他们是否以同样的方式运行?我的模式匹配示例尾递归吗?如果没有,那么为什么不在第二个例子中呢?
还有其他我应该担心的事情,比如资源吗?或者我应该总是尝试使用模式匹配?
我已经四处寻找这些答案,但却找不到任何最佳做法"为此!
编辑:我知道所使用的示例有点做作 - 我刚刚添加它以清楚下面的问题 - 谢谢!
答案 0 :(得分:6)
是的,他们确实运行相同。每种语法糖的最佳实践都是相同的:只要它提供更易读或更灵活的代码,就可以使用它。在if
语句的示例中,您可以省略大括号并只写
def myThing(a: Int): Int = if (a > 0) a else myThing(a + 1)
这绝对比模式匹配更方便。在以下情况下,模式匹配很方便:
同样to ensure you function is tail-recursive您可以使用@tailrec
注释
答案 1 :(得分:2)
另一种“Scala”方法是为正数定义一个提取器
def myThing(a: Int): Int = a match {
case PositiveNum(positive) => positive
case negative => myThing(negative + 1)
}
object PositiveNum {
def unapply(n: Int): Option[Int] = if (n > 0) Some(n) else None
}
答案 2 :(得分:1)
另一种模式匹配评估谓词(条件)的方法,
def myThing(a: Int): Int = a > 0 match {
case true => a
case _ => myThing(a + 1)
}
其中匹配包括没有(附加)警卫或类型声明。