Kompilator Scala automatycznie zoptymalizuje każdą prawdziwie rekurencyjną metodę. Jeśli dodasz adnotację do metody, która Twoim zdaniem jest rekurencyjna z ogonem @tailrec
, kompilator ostrzeże Cię, jeśli metoda faktycznie nie jest rekurencyjna. To sprawia, że @tailrec
adnotacja jest dobrym pomysłem, zarówno po to, aby upewnić się, że metoda jest obecnie optymalizowana, jak i że pozostaje optymalna po zmodyfikowaniu.
Zauważ, że Scala nie uważa metody za rekurencyjną ogonową, jeśli można ją przesłonić. Dlatego metoda musi być albo prywatna, ostateczna, na obiekcie (w przeciwieństwie do klasy lub cechy), albo wewnątrz innej metody, która ma być zoptymalizowana.
override
adnotacja w Javie - kod działa bez niej, ale jeśli go tam umieścisz, powie ci, czy popełniłeś błąd.Adnotacja jest
scala.annotation.tailrec
. Wywołuje błąd kompilatora, jeśli metoda nie może zostać zoptymalizowana pod kątem wywołań tail, co dzieje się, gdy:Jest umieszczany tuż przed
def
definicją metody. Działa w REPL.Tutaj importujemy adnotację i próbujemy oznaczyć metodę jako
@tailrec
.Ups! Ostatnie wezwanie brzmi
1.+()
: nielength()
! Sformułujmy ponownie metodę:Zauważ, że
length0
jest to automatycznie prywatne, ponieważ jest zdefiniowane w zakresie innej metody.źródło