2013-09-21 10 views
6

Ich bin neu in Scala und ich übe derzeit im Arbeitsblatt. Ich bemerkte, dass @tailrec nicht in dem Arbeitsblatt funktioniert, obwohl ich@tailrec Fehler in Scala Eclipse Arbeitsblatt: erwarteter Beginn der Definition

den Import hinzugefügt
import scala.annotation.tailrec 

Dies ist die Version von scala i bin mit

Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL 

einen Weg gibt, gibt es zu bekommen arbeiten? Danke

+0

Ohne den Code zu sehen, die den Fehler erzeugt, ist es unmöglich zu bestimmen, was falsch. – reggert

Antwort

9

Das Problem, das Sie beschrieben ist ein Fehler in der Eclipse-IDE für Scala: https://scala-ide-portfolio.assembla.com/spaces/scala-ide/tickets/1001636#/activity/ticket

Die Abhilfe ist die @tailrec in einem def oder ein anderes Objekt zu setzen.

zB:

package tailrecfunc 

import scala.annotation.tailrec 

object Session17 { 
    val block = { 
    @tailrec 
    def tailrecfunc(n: Int): Int = 
    if(n == 0) n; else tailrecfunc(n - 1) 

    tailrecfunc(4) 
    }           
} 

Auf diese Weise der scala Dolmetscher wird Sie warnen, wenn die Funktion nicht Schwanz rekursive

ist
1

Zuerst definieren und stub die Funktion, die Sie annotieren möchten, dann gehen Sie zurück und fügen Sie die Anmerkung hinzu.

4

Seien Sie vorsichtig, dass Sie nicht verwechseln, wie die @tailrec Annotation funktioniert - sie erzwingt keine Funktion, die vom Compiler in einer "tail-rekursiven Weise" optimiert wird (der Compiler wird diese Optimierung sowieso vornehmen, wenn es möglich ist).

Stattdessen ist es einfach eine Markierung, die Sie verwenden können, um den Compiler zu sagen "Ich denke, dass diese Funktion erfolgreich tail rekursiv geschrieben wurde, bitte sagen Sie mir, wenn Sie es auf diese Weise nicht optimieren können."

Verwenden Sie es, wo Sie sicher sein wollen, dass Sie eine Funktion richtig geschrieben haben, die tail-recusive sein soll, und der Compiler kann darauf hinweisen, wenn Sie es falsch verstehen.

Macht das Sinn dessen, was Sie sehen? Ich kann nichts nützlicheres sagen, ohne den Beispielcode zu sehen, in dem Sie die Annotation verwendet haben.

Verwandte Themen