2016-09-27 3 views
2

TYPE A:Wy führen diese scheinbar äquivalenten Funktionsdefinitionen zu unterschiedlichen Ergebnissen?

val even1 = (x:Int) => { println("in even1"); x % 2 == 0} 

Ausgabe auf REPL:

even1: Int => Boolean = <function1> 

TYP B:

val even2 : Int => Boolean = { println("in even2");_% 2 == 0} 

Ausgabe auf REPL:

in even2 
even2: Int => Boolean = <function1> 

Ich kenne den Unterschied zwischen " def 'und 'val' Deklaration einer Funktion, obige Bedingung sieht für mich etwas anders aus. Bitte helfen Sie zu verstehen.

Antwort

5

even1 und even2 sind in der Tat nicht gleichwertig. Um hier zu verstehen, warum eine andere, aber äquivalente Art und Weise der Definition even2 ist:

val even2 : Int => Boolean = { println("in even2"); x => x % 2 == 0 } 

Jetzt ... Die rechte Seite (RHS) von even1 ‚s Definition ist eine Funktion, die ein Int und gibt einen Block nimmt Das enthält eine print-Anweisung gefolgt von einem booleschen Ausdruck.

Im Gegensatz dazu sind die Funktion und der Block in even2 "von innen nach außen": Die rechte Seite ist ein Block, der eine Druckanweisung und eine Funktion vom Typ Int => Boolean enthält.

In Scala, ein Block ist ein Ausdruck, und das Ergebnis dieser Expression ist das Ergebnis des letzten Ausdrucks (falls vorhanden; () auf andere Weise), dass der Block enthält. Daher wird die println-Anweisung in even1 jedes Mal ausgeführt, wenn even1 aufgerufen wird, während die println-Anweisung in even2 nur einmal ausgeführt wird, wenn even2 definiert ist.

+0

'Die Anweisung println in even1 wird jedes Mal ausgeführt, wenn even1 aufgerufen wird, während die Anweisung println in even2 nur einmal ausgeführt wird, wenn even2 definiert ist. Warum? Die Antwort, die du zur Verfügung stellst (wie es ist), würde auch für 'even1' gelten:' Die rechte Seite ist ein Block ... ' – jarandaf

+0

Ich möchte gleich fragen, warum dieses unterschiedliche Verhalten? Beide Funktionen, Erklärung sieht auf REPL gleich aus Ausgabe – Sunny

+1

@jarandaf Nein. Die rechte Seite der Definition von 'even1' ist kein Block, sondern eine Funktion: '(x: Int) => {println (" in even1 "); x% 2 == 0} '. – Jubobs

Verwandte Themen