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
.