8 Stimmen

Ist in Scala alles eine Funktion, ein Ausdruck oder ein Objekt?

Ich bin verwirrt.

Ich dachte, alles sei ein Ausdruck, weil die Anweisung einen Wert zurückgibt. Aber ich habe auch gehört, dass in Scala alles ein Objekt ist.

Was ist es in Wirklichkeit? Warum hat sich scala für die eine oder andere Variante entschieden? Was bedeutet das für einen Scala-Entwickler?

16voto

Niklas B. Punkte 88763

Ich dachte, alles sei ein Ausdruck, weil die Anweisung einen Wert zurückgibt.

Es gibt Dinge, die keine Werte haben, aber im Großen und Ganzen ist das richtig. Das bedeutet, dass wir die Unterscheidung zwischen "Anweisung" und "Ausdruck" in Scala im Grunde fallen lassen können.

Der Begriff "gibt einen Wert zurück" ist jedoch nicht ganz zutreffend. Wir sagen, dass alles zu einem Wert "ausgewertet" wird.

Aber ich habe auch gehört, dass in Scala alles ein Objekt ist.

Das steht überhaupt nicht im Widerspruch zu der vorherigen Aussage :) Es bedeutet nur, dass jede mögliche Wert ein Objekt ist (so dass jeder Ausdruck zu einem Objekt ausgewertet wird). Übrigens sind auch Funktionen, als Bürger erster Klasse in Scala, Objekte.

Warum hat sich scala für die eine oder andere Variante entschieden?

Es ist anzumerken, dass dies eine Verallgemeinerung der Java-Methode ist, bei der Anweisungen und Ausdrücke unterschiedliche Dinge sind und nicht alles ein Objekt ist. Man kann jedes Stück Java-Code ohne große Anpassungen nach Scala übersetzen, aber nicht umgekehrt . So macht diese Design-Entscheidung Scala ist in der Tat mächtiger in Bezug auf Prägnanz und Ausdruckskraft.

Was bedeutet das für einen Scala-Entwickler?

Das bedeutet zum Beispiel, dass:

  • Sie brauchen oft nicht return denn Sie können den Rückgabewert einfach als letzten Ausdruck in eine Methode einfügen
  • Sie können die Tatsache ausnutzen, dass if y case sind Ausdrücke, die Ihren Code kürzer machen

Ein Beispiel wäre:

def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"

// ...
println(mymethod(10))  // => prints "yay!"
println(mymethod(0))   // => prints "too low!"

Wir können den Wert eines solchen zusammengesetzten Ausdrucks auch einer Variablen zuweisen:

val str = value match {
            case Some(x) => "Result: " + x
            case None    => "Error!"
          }

8voto

oxbow_lakes Punkte 131223

Der Unterschied besteht darin, dass die Behauptung "Alles ist ein Ausdruck" über Codeblöcke gemacht wird, während "Alles ist ein Objekt" über die Werte in Ihrem Programm gemacht wird.


Code-Blöcke

In der Sprache Java gibt es sowohl Ausdrücke y Aussagen . Das heißt, jeder "Block" von Code ist entweder ein Ausdruck o eine Erklärung;

//the if-else-block is a statement whilst (x == 4) is an expression
if (x == 4) {
    foo();
}
else {
    bar();
}

Ausdrücke haben eine Typ Anweisungen nicht; Anweisungen werden aufgerufen nur wegen ihrer Nebenwirkungen .

In Scala, jeder Code-Block ist ein Ausdruck Das heißt, sie hat einen Typ:

if (x == 4) foo else bar //has the type lub of foo and bar

Dies ist äußerst wichtig! Ich kann das nicht genug betonen; es ist eines der Dinge, die die Arbeit mit Scala so angenehm machen, weil ich einem Ausdruck einen Wert zuweisen kann.

val x = if (x == 4) foo else bar

Werte

Mit Wert meine ich etwas, auf das wir im Programm verweisen können:

int i = foo(); //i is a reference to a value
java.util.TimeUnit.SECONDS;

In Java wird die i ist kein Objekt - es ist ein Primitivum. Außerdem kann ich auf das Feld SECONDS de TimeUnit aber TimeUnit ist auch kein Objekt, sondern ein statisch (in Ermangelung eines besseren Ausdrucks). In Scala:

val j = 4
Map.empty

Was die Sprache betroffen ist, j ist ein Objekt (und ich kann Methoden an es senden), ebenso wie Map - das Modul (oder Begleitobjekt) für den Typ scala.collection.immutable.Map .

6voto

missingfaktor Punkte 88801

Ist in Scala alles eine Funktion, ein Ausdruck oder ein Objekt?

Nichts von alledem.

Es gibt Dinge, die keine Objekte sind, z. B. Klassen und Methoden.

Es gibt Dinge, die keine Ausdrücke sind, z.B. class Foo { } ist eine Anweisung, die keinen Wert ergibt. (Dies ist im Grunde derselbe Punkt wie oben.)

Es gibt Dinge, die keine Funktionen sind. Dafür brauche ich keine Beispiele zu nennen, denn in jedem Scala-Code gibt es reichlich davon zu sehen.

Mit anderen Worten: "Alles ist ein X" ist nichts weiter als ein Verkaufsargument (im Falle von Scala).

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