23.5. Adnotacja tailrec

Adnotacja scala.annotation.tailrec służy do oznaczania metod. Jeśli metoda oznaczona tą adnotacją nie może być zoptymalizowana za pomocą optymalizacji ogonowej, to kompilator powinien wygenerować komunikat o błędzie.

Plik TailRecLoops.scala:
import scala.annotation.tailrec
class TailRecLoops {
  @tailrec
  final def repeat1(n: Int, body: => Unit) {
    if (n > 1) repeat1(n-1, body)
    body
  }
  @tailrec
  def repeat2(n: Int, body: => Unit) {
    body
    if (n > 1) repeat2(n-1, body)
  }
}

Kompilacja obiektu TailRecLoops z pliku TailRecLoops.scala nie udaje się.

$ scalac TailRecLoops.scala
TailRecLoops.scala:6: error: could not optimize @tailrec annotated method repeat1: it contains a recursive call not in tail position
    body
    ^
TailRecLoops.scala:9: error: could not optimize @tailrec annotated method repeat2: it is neither private nor final so can be overridden
  def repeat2(n: Int, body: => Unit) {
      ^
two errors found

Metoda repeat1 jest oznaczona adnotacją tailrec, ale nie może zostać zoptymalizowana, gdyż zawiera wywołanie rekurencyjne, które nie jest w pozycji ogonowej. Metoda repeat2 jest oznaczona adnotacją tailrec, ale nie może zostać zoptymalizowana, gdyż może zostać nadpisana w klasie pochodnej.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.