2

アノテーションで指示していない関数の 1 つに末尾再帰を適用すると、コンパイラに警告してもらいたいです。これは可能ですか?

動機:私は論理エラーの問題として無限ループを書くことはめったにありませんが、タイプミスをしてしまいました (はい、可能です)。通常、再帰的な無限ループは、スタック オーバーフロー例外の何が問題なのかを教えてくれるだけですが、テールを再帰的にコンパイルした場合は、ハングするだけです。

デフォルトのパラメーターを持つケースクラスと組み合わせてキーワードを忘れることnewは、私がばかげて2回つまずいた良い例です:

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 は [インスペクション] > [Scala: 一般] の下に「末尾再帰アノテーションなし」を提供しています。

メソッドが末尾呼び出しの最適化でコンパイルされることを検証する @tailrec アノテーションなしで、末尾再帰メソッドを検出します。

于 2014-12-29T23:14:04.560 に答える
0

実用的な場合は、関数の戻り値の型を宣言しないでください。def apply(a: Int) = A(a)コンパイルに失敗すると、何かが間違っていることがわかります。

于 2014-12-30T05:48:06.943 に答える