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?

War es hilfreich?

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: "()"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top