Kann jemand erklären, was hier los ist?
Frage
Hier ist der Code:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
Ich vermute, A ist vom Typ Einheit, aber ist ein Einheit nicht ein Objekt? Ist die Einheitsklasse versteckt?
Lösung
Unit
ist ein AnyVal
, wie Int
. Sein alleiniges Mitglied ist ein wörtlicher, geschrieben als ()
. Zum Beispiel:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: Unit => String)Unit => String
scala> foo(a => a.toString)
res0: Unit => String = <function1>
scala> res0(())
res1: String = ()
Andere Tipps
Arbeiten Sie an Ihren Beispielen ...
def foo(bar: Unit => String) = {bar}
Dies definiert die foo
Methode, die eine Funktion von akzeptiert Unit
zu String
Als alleinige Argumentation und einfach das gleiche Argument zurückgibt.
foo(a => a.toString)
a => a.toString
Definiert eine Funktion Inline. Weil der Typ -Inferenzer weiß, dass eine Funktion Unit => String
Es wird an diesem Ort erwartet, es färbt sich a
vom Typ sein Unit
.
Diese Berufung von foo
Gibt dann die anonyme Funktion zurück, die Sie gerade definiert haben.
Ich bin neugierig, was genau hast du hier zu erreichen? Oder erkundeten Sie gerade Scalas Syntax?
In Scala Unit
entspricht Java's void
. Sie haben eine Funktion definiert, die eine andere Funktion ohne Parameter akzeptiert und a zurückgibt String
.
Dies entspricht zu def foo(bar: => String);
Oder def foo(bar: () => String)
In Scala ()
ist eine Abkürzung für Unit
Die Antwort von Kevin Wright ist völlig korrekt, um sie jedoch weiter zu brechen:
Die erste Zeile deklariert eine Funktion namens namens foo
. foo
nimmt als Argument eine andere Funktion, bar
das selbst nimmt auf Unit
und kehrt eine zurück String
. Allgemein gesagt, Unit
in Scala hat die gleiche Bedeutung, wie void
tut in vielen anderen Sprachen, also könnte man größtenteils sagen, das bar
ist eine Funktion, die keine Argumente aufnimmt und a zurückgibt a String
.
Der Körper des foo
Funktion gibt einfach das von ihm empfangene Argument zurück. Daher färbt Scala das foo
Gibt eine Funktion zurück, die dauert Unit
und kehrt eine zurück String
.
Der zweite Befehl ruft Anrufe auf foo
mit der Funktion a => a.toString
als Argument. a
wird von Typ angenommen Unit
. Wenn Unit
war ein genaues Analogon zu void
, Das würde nicht funktionieren. Sie können nicht anrufen toString
über etwas. Jedoch, Unit
verhält sich etwas anders, genau in solchen Situationen und und a
wird eine Instanz von gegeben Unit
. Diese Instanz wird nicht wirklich viel tun, aber es wird in der Lage sein, es zu haben toString
rief es an. Das Ergebnis des zweiten Befehls ist also eine Funktion, die das Ergebnis von zurückgibt toString
aufgerufen Unit
Instanz, was ist: "()"