Was ist der Unterschied zwischen => , ()=> und Unit=>

Ich versuche darstellen, eine Funktion, die keine Argumente entgegennimmt und keinen Wert zurückgibt (ich bin die Simulation der setTimeout-Funktion in JavaScript, wenn Sie müssen wissen.)

case class Scheduled(time : Int, callback :  => Unit)

nicht kompilieren, zu sagen "`val' - Parameter kann nicht sein, call-by-name"

case class Scheduled(time : Int, callback :  () => Unit)  

kompiliert, hat aber geltend gemacht werden, komischerweise, statt

Scheduled(40, { println("x") } )

Habe ich dazu

Scheduled(40, { () => println("x") } )      

Was auch funktioniert, ist

class Scheduled(time : Int, callback :  Unit => Unit)

aber ist aufgerufen, in einer noch-weniger-sinnvolle

 Scheduled(40, { x : Unit => println("x") } )

(Was wäre eine variable vom Typ Einheit sein?) Was ich wollen natürlich ist ein Konstruktor, der sein kann, berufen sich auf die Weise würde ich es aufrufen, wenn es eine gewöhnliche Funktion:

 Scheduled(40, println("x") )

Geben baby seine Flasche!

Eine weitere Möglichkeit zur Verwendung von case-Klassen mit Namen parms, ist, um Sie in einer sekundären parameter-Liste, z.B. case class Scheduled(time: Int)(callback: => Unit). Dies funktioniert, da die sekundären parameter Liste ist nicht öffentlich bloßgestellt, noch ist es enthalten in der generierten equals/hashCode Methoden.
Ein paar weitere interessante Aspekte in Bezug auf die Unterschiede zwischen by-name-Parameter und 0-arheit-Funktionen sind in diese Frage und die Antwort. Es ist eigentlich das, was ich suchte, als ich fand diese Frage.

InformationsquelleAutor Malvolio | 2010-12-28

Schreibe einen Kommentar