2017-10-01 3 views
4

In diesem einfachen Codebeispiel ...Muss Lokale Funktionen Kotlin Vor dem Gebrauch

fun testLocalFunctions() { 
    aLocalFun() //compiler error: unresolved reference at aLocalFun 
    fun aLocalFun() {} 
    aLocalFun() //no error 
} 

Anderswo in der Sprache erklärt werden, unter Verwendung einer Funktion vor Definition erlaubt ist. Für lokale Funktionen scheint dies jedoch nicht der Fall zu sein. Unter Bezugnahme auf Kotlin Language Specification ist der Abschnitt über lokale Funktionen immer noch mit "TODO" gekennzeichnet.

Da diese Art von Einschränkung für andere Arten von Funktionen (Top-Level- und Member-Funktionen) nicht gilt, ist das ein Fehler?

(Zugegeben, müssen lokale Variablendeklarationen vor der Verwendung auftreten, so dass die gleiche Einschränkung für lokale Funktionen ist nicht unvernünftig. Gibt es ein definitives, vorzugsweise maßgebliche Quelle Dokument, das dieses Verhalten diskutiert?)

+1

Lokale Funktionen können lokale Variablen verwenden. Ohne diese Einschränkung würden Sie mit einem wesentlich komplexeren Ergebnis wie "eine lokale Funktion kann nur nach Deklarationen aller lokalen Variablen verwendet werden" enden. –

Antwort

4

Es ist kein Fehler, es ist das entworfene Verhalten.

Wenn Sie ein Symbol (Variable, Typ oder Funktionsname) in einem Ausdruck verwenden, wird das Symbol für einen bestimmten Bereich aufgelöst. Wenn wir das Schema vereinfachen, wird der Geltungsbereich durch das Paket, die Importe, die äußeren Deklarationen (z. B. andere Elemente des Typs) gebildet, und wenn der Ausdruck innerhalb einer Funktion platziert wird, enthält der Bereich auch die lokalen Deklarationen vor dem Ausdruck .

So können Sie eine lokale Funktion nicht verwenden, bis sie deklariert wird, so wie Sie eine lokale Variable nicht verwenden können, die bis zu diesem Punkt nicht deklariert wurde: es ist nur außerhalb des Bereichs.

Verwandte Themen