我希望编译器在我没有通过注释告诉它时将尾递归应用于我的一个函数时发出警告。这可能吗?
动机:我很少写出无限循环作为逻辑错误的问题,但我已经完成了错别字(是的,这是可能的)。通常递归无限循环只是告诉你堆栈溢出异常有什么问题,但是如果它们以递归方式编译尾部则不会挂起。
将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)
不
答案 0 :(得分:3)
我不认为编译器有这个,但IntelliJ提供了一个"无尾递归注释"在检查下>斯卡拉:将军
检测没有@tailrec注释的尾递归方法,该方法验证该方法将使用尾调用优化进行编译。
答案 1 :(得分:0)
在实际应用时避免声明函数返回类型:def apply(a: Int) = A(a)
将无法编译,因此您可能知道出现了问题。