我对 java 的 scala 还很陌生,对模式匹配也很陌生。我试图弄清楚的一件事是何时使用它以及它的成本/ yield 是什么。比如这个
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
注释
关于Scala 案例类和尾递归最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721476/