2

当我没有用注释告诉它时,我希望编译器在将尾递归应用于我的一个函数时警告我。这可能吗?

动机:我很少写无限循环作为逻辑错误的问题,但我已经完成了拼写错误(是的,这是可能的)。通常递归无限循环只是告诉你堆栈溢出异常有什么问题,但如果它们被递归编译尾部,它只是挂起。

忘记new关键字与具有默认参数的案例类结合是一个很好的例子,我愚蠢地偶然发现了两次:

case class A(a: Int, b: Int = 1)

object A {
  def apply(a: Int): A = A(a)

导致没有 SO 的无限循环,但def apply(a: Int): A = new A(a)不会

4

2 回答 2

3

我认为编译器没有这个,但 IntelliJ 在 Inspections > Scala: General 下提供了“无尾递归注释”

检测没有 @tailrec 注释的尾递归方法,该注释验证该方法将使用尾调用优化进行编译。

于 2014-12-29T23:14:04.560 回答
0

避免在实际情况下声明函数返回类型:def apply(a: Int) = A(a)将无法编译,因此您会知道有问题。

于 2014-12-30T05:48:06.943 回答