2016-05-02 9 views
1

Ich bin neu bei scala und habe mich gefragt, was die folgende Syntax bedeutet?Was bedeutet die Syntaxfunktion [T] in scala?

def exec[T](f:() => T): T = { 
    f() 
} 

Soweit mein Verständnis der Funktion „exec“ erwartet Funktion als Argument und gibt Wert vom Typ „T“ aber was tut exec [T] bedeutet?

+0

Die '[T]' 'in exec [T]' 'definiert T' als Typ-Parameter. – marstran

Antwort

6

exec ist der Methodenname, wobei T der generische Typparameter für die Methode ist. Die Methodensignatur muss den Typ T angeben, damit wir T als Argument für die Methode angeben können.

Bei Verwendung eines generischen Typparameter verwenden, können Sie verschiedene Arten und Wiederverwendung der gleichen Code zwischen ihnen, zum Beispiel passieren kann:

scala> exec[Int](() => 1) 
res29: Int = 1 

scala> exec[Double](() => 1.0) 
res30: Double = 1.0 

scala> exec[String](() => "hello, world") 
res31: String = hello, world 

Als ich exec[Int] erklären, wird der Parameter f ist nun ein Function0[Int]] (oder () => Int Wenn wir syntaktischen Zucker verwenden)

Wie @TzachZohar Notizen, der Scala-Compiler ist schlau genug, in der Lage, den Typ Parameter für uns zu Zeiten abzuleiten, was bedeutet, dass wir die eckige Klammer weglassen können, wenn Sie mit der Methode arbeiten. Zum Beispiel:

scala> exec(() => 1) 
res32: Int = 1 

scala> exec(() => 1.0) 
res33: Double = 1.0 

scala> exec(() => "hello, world") 
res34: String = hello, world 

Dies funktioniert wie der Compiler den Typ der T durch die Verfahren in der Lage, den Rückgabetyp zu schließen.

Sie können mehr zu diesen Themen lesen: Type & polymorphism basics, Generic Classes, Local Type Inference und die Scala Specification for Local Type Inference

+0

Wichtig zu beachten, dass der Typ abgeleitet werden kann, so dass eine Methode mit einem Typparameter aufgerufen werden kann, ohne den Typ explizit anzugeben, z. 'exec (() => 1)' funktioniert genau wie 'exec [Int] (() => 1)' –

+0

@TzachZohar True. Ich werde meine Antwort aktualisieren (aktualisiert). –

+0

'() => Int' ist nicht' Function1 [Unit, Int] ', es ist' Function0 [Int] '. 'Function1 [Unit, Int]' wäre 'Unit => Int' und heißt' f (()) ':) –