我对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)
}

所以我的实际问题是:
但是它们是否以相同的方式运行?我的模式匹配示例尾递归吗?如果不是,那么为什么不在第二个示例中呢?

还有其他我应该担心的事情,例如资源吗?还是我应该总是尝试使用模式匹配?

我一直在寻找这些答案,但是还没有找到任何“最佳实践”!

编辑:我知道所使用的示例有点人为-我刚刚添加了它,以明确它下面的问题-谢谢!

最佳答案

是的,它们确实运行相同。每个语法糖的最佳实践都是相同的:只要它提供了更具可读性或灵活性的代码,就应使用它。在示例中,如果使用if语句,则可以省略花括号并只写

def myThing(a: Int): Int =  if (a > 0) a else myThing(a + 1)

绝对比模式匹配更方便。模式匹配在以下情况下非常方便:
  • 您有3个或更多替代品
  • 您应该通过extractors解包\检查值(检查this question)
  • 您应该check the types

  • 另外to ensure you function is tail-recursive您可以使用@tailrec批注

    09-09 21:31
    查看更多