Ek açıklama scala.annotation.tailrec
. Yöntem kuyruk çağrısı optimize edilemiyorsa bir derleyici hatasını tetikler, bu şu durumlarda gerçekleşir:
- Özyinelemeli çağrı kuyruk konumunda değil
- Yöntem geçersiz kılınabilir
- Yöntem nihai değil (önceki özel durum)
def
Bir yöntem tanımının hemen önüne yerleştirilir . REPL'de çalışır.
Burada ek açıklamayı içe aktarıyoruz ve bir yöntemi olarak işaretlemeye çalışıyoruz @tailrec
.
scala> import annotation.tailrec
import annotation.tailrec
scala> @tailrec def length(as: List[_]): Int = as match {
| case Nil => 0
| case head :: tail => 1 + length(tail)
| }
<console>:7: error: could not optimize @tailrec annotated method: it contains a recursive call not in tail position
@tailrec def length(as: List[_]): Int = as match {
^
Oops! Son çağrı 1.+()
, değil length()
! Yöntemi yeniden formüle edelim:
scala> def length(as: List[_]): Int = {
| @tailrec def length0(as: List[_], tally: Int = 0): Int = as match {
| case Nil => tally
| case head :: tail => length0(tail, tally + 1)
| }
| length0(as)
| }
length: (as: List[_])Int
length0
Başka bir yöntem kapsamında tanımlandığı için bunun otomatik olarak özel olduğunu unutmayın .
override
Java'daki ek açıklamaya benziyor - kod onsuz çalışır, ancak oraya koyarsanız size bir hata yapıp yapmadığınızı söyler.