2 Stimmen

Kann jemand erklären, was hier vor sich geht?

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, dass a vom Typ Unit ist, aber ist Unit nicht ein Objekt? Ist die Klasse Unit versteckt?

4voto

Kevin Wright Punkte 49145

Ausgehend von Ihren Beispielen...

def foo(bar: Unit => String) = {bar}

Damit wird die foo Methode, die eine Funktion aus Unit a String als einziges Argument und gibt einfach dasselbe Argument zurück.

foo(a => a.toString)

a => a.toString definiert eine Funktion inline. Da der Typ-Inferencer weiß, dass eine Funktion Unit => String an diesem Ort zu erwarten ist, folgert sie a vom Typ Unit .

Diese Anrufung von foo gibt dann die anonyme Funktion zurück, die Sie gerade definiert haben.

Ich bin neugierig, was genau wollten Sie hier erreichen? Oder haben Sie nur die Syntax von Scala erforscht?

4voto

Daniel C. Sobral Punkte 290004

Unit ist eine AnyVal , wie Int . Sein einziges Mitglied ist ein Literal, 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 = ()

2voto

Amir Raminfar Punkte 33200

In Scala Unit ist äquivalent zu Javas void . Sie haben eine Funktion definiert, die eine andere Funktion ohne Parameter annimmt und eine String .

Dies ist gleichbedeutend mit def foo(bar: => String); Oder def foo(bar: () => String)

In Scala () ist eine Abkürzung für Unit

2voto

nonVirtualThunk Punkte 2832

Die von Kevin Wright gegebene Antwort ist völlig richtig, aber ich möchte sie noch weiter aufschlüsseln:

Die erste Zeile deklariert eine Funktion namens foo . foo nimmt als Argument eine andere Funktion, bar die ihrerseits die Unit und gibt eine String . Ganz allgemein gesprochen, Unit hat in Scala die gleiche Bedeutung wie void in vielen anderen Sprachen, man könnte also sagen, dass die meisten bar ist eine Funktion, die keine Argumente entgegennimmt und eine String .

Der Körper des foo Funktion gibt einfach das empfangene Argument zurück. Daher folgert scala, dass foo gibt eine Funktion zurück, die Unit und gibt eine String .

Der zweite Befehl ruft foo mit der Funktion a => a.toString als sein Argument. a wird angenommen, dass sie vom Typ Unit . Wenn Unit war ein genaues Analogon zu void würde dies nicht funktionieren. Sie können nicht anrufen toString über die Abwesenheit von etwas. Wie auch immer, Unit verhält sich genau für solche Situationen etwas anders, und a erhält eine Instanz von Unit . Diese Instanz wird nicht wirklich viel tun können, aber sie wird in der Lage sein toString angerufen. Das Ergebnis des zweiten Befehls wird also eine Funktion sein, die das Ergebnis von toString aufgerufen am Unit Instanz, die lautet: "()"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X