以下是演示我的问题的最小示例:
@tailrec
def fun(x: Int): Int = {
val y = x match {
case 5 => return fun(6)
case 7 => return fun(6)
case 6 => 40
case _ => throw new AssertionError("only 5, 6 and 7 allowed")
}
y + 2
}
Eclipse抱怨以下错误消息:
could not optimize @tailrec annotated method
it contains a recursive call not in tail position
由于return
关键字,有两个递归调用,据我所知,在尾部位置。
Eclipse究竟抱怨什么?我只是没有看到它。
答案 0 :(得分:5)
return
导致它不是尾调用。
请改用以下内容:
@tailrec
def fun(x: Int): Int = x match {
case 5 => fun(6)
case 7 => fun(6)
case 6 => 42
case _ => throw new AssertionError("only 5, 6 and 7 allowed")
}
这可能是一个实现错误,或者与return x
编译代码的可能性有关,该代码在检查{{1}之后的编译阶段引发NonLocalReturnControl
异常}。