एनोटेशन है scala.annotation.tailrec
। यह संकलक त्रुटि को ट्रिगर करता है यदि विधि टेल कॉल को अनुकूलित नहीं किया जा सकता है, जो कि होता है:
- पुनरावर्ती कॉल पूंछ की स्थिति में नहीं है
- विधि को ओवरराइड किया जा सकता है
- विधि अंतिम नहीं है (पूर्ववर्ती का विशेष मामला)
इसे def
एक विधि परिभाषा के ठीक पहले रखा गया है । यह आरईपीएल में काम करता है।
यहां हम एनोटेशन आयात करते हैं, और एक विधि को चिह्नित करने का प्रयास करते हैं @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 {
^
ऊप्स! अंतिम आह्वान है 1.+()
, नहीं length()
! आइए विधि में सुधार करें:
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
यह स्वचालित रूप से निजी है क्योंकि इसे किसी अन्य विधि के दायरे में परिभाषित किया गया है।
override
जावा में एनोटेशन की तरह है - कोड इसके बिना काम करता है, लेकिन अगर आप इसे वहां डालते हैं तो यह बताता है कि क्या आपने गलती की है।