2017-03-26 2 views

Antwort

1

Ich nehme an, mit der Funktion meinen Sie eine anonyme Funktion, denn dann wird ein FunctionN-Typ instanziiert.

Die Apply-Methode von functionN wird mit den Funktionsargumenten aufgerufen, die laut den Dokumenten "den Rumpf dieser Funktion auf das Argument anwenden".

Bedenken Sie:

object Main { 

    def main(args: Array[String]): Unit = { 

    def anonFun = (x: Int) => x 

    anonFun(5) 
    } 
} 

Wenn Sie an der Bytecode aussehen erzeugt Sie so etwas wie die folgenden sehen werden:

INVOKESPECIAL com/mf/Main$.anonFun$1()Lscala/Function1; 
ICONST_5 
INVOKEINTERFACE scala/Function1.apply$mcII$sp (I)I 

invokespecial lädt die anonyme Funktion, dann ist die Konstante 5 geladen und Die Methode apply der Funktion1 wird mit der Konstante aufgerufen.

+0

Ist dies 2,11 oder 2,12? Irgendwie hatte ich erwartet, dass es in 2.12 mit der neuen Java8-lambda-kompatiblen Kodierung anders aussieht. –

+0

@ JörgWMittag Ich lief es in 2.11, aber in 2.12 ist der Bytecode, den ich präsentierte, der gleiche. Was anders ist, ist in 2.11 eine neue anonyme Klasse erstellt, wo anonFun $ 1 definiert ist, aber in 2.12 Java8 INVOKEDYNAMIC wird verwendet, um einen Lambda-Ausdruck zu erstellen. Es ist also anders, nur nicht im eigentlichen Bereich, wo die anon-Funktion aufgerufen wird. –

+0

Danke für die Information! –