2009-12-12 15 views

Antwort

20

Weil die meiste Zeit Sie den int Teil weglassen können. Scala hat ein viel besseres System von Typinferenz als Java.

+0

Wenn Sie ein Beispiel mit und ohne Typ hinzufügen, wird der Grund deutlicher. –

+1

Hängt davon ab. Manchmal, wenn die rechte Seite kompliziert ist (besonders beim Erstellen von APIs), sollten Sie Typen mit Anmerkungen versehen, da sie viele Fehler zur Kompilierungszeit auffängt. – Raphael

8

x: T ist die Standardnotation für Typen in Logik und vielen Programmiersprachen. C und seine Nachkommen, mit Java unter ihnen, weicht davon ab. Aber die Typnotation von C ist wirklich schrecklich (versuchen Sie, den Typ für eine mäßig komplizierte Funktion höherer Ordnung wie map aufzuschreiben).

Auch mit dieser Notation ist es einfach, den Typ wegzulassen (wie Wysawyg bereits geschrieben hat), oder einen Typ innerhalb eines Ausdrucks hinzuzufügen.

2

Hier ist ein Beispiel zu Wysawyg Aussage:

val capacity = 2 

Aber Sie können normalerweise nicht tun mit nur einem val.

trait Foo { 
    def capacity = 2 // Allow child classes to override and decide the value later 
} 

// Force instances of Bar to set the value 
class Bar(override val capacity : Int) extends Foo 

// Have Bat determine it on the fly 
trait Bat extends Foo { 
    def onlyAThird : Int 
    override def capacity = onlyAThird * 3 
} 

(Ich habe versucht, dies als Kommentar einfügen, aber leider keine Formatierung.)

+0

Warum verwenden Sie 'def 'für eine Literalkonstante? Weiter: "def" scheint hier übrigens als "default" zu gelten. –

+1

Ah, 'def' ist ungefähr über die Auswertungszeit. Wenn wir "val capacity = 2" sagen, können Sie nicht zulassen, dass "Bat" 'Foo' mit einer Funktion erweitert, die die Kapazität im laufenden Betrieb bestimmt. –

+0

Ich denke ich verstehe jetzt. Sie definieren es einfach als 'def', um es durch eine Methode außer Kraft setzen zu lassen.Ein Wert wäre nur durch einen anderen Wert übersteuerbar. –

2

In Programmierung in Scala es der technische Grund für diese Syntax sagt, ist es die Typinferenz erleichtert.

+4

Wie vereinfacht die Platzierung von Typen die Typinferenz? Sie können beide zum exakt gleichen AST konvertieren. – Raphael

+0

Wahrscheinlich für den "menschlichen Leser". :-) – soc

0

Ich denke, Daniel dachte an etwas wie folgt aus:

val a = 7 
val b: Int = 8 

var x = "Foo" 
var y: String = "Bar" 

def sum (a: Int, b: Int) = a + b 
def mul (a: Int, b: Int): Int = a * b 

Die Art oft abgeleitet werden kann.

10

Ich glaube, ich habe eine Aussage von Martin Odersky selbst gelesen, die besagt, dass diese Entscheidung auch getroffen wurde, um die Lesbarkeit zu verbessern. Dies ist sicherlich der Fall, z. Vergleichen

val Double number = ... 
val Array[(Seq[String], Map[Seq[String], Double])] something = ... 
val String pattern = ... 

mit

val number : Double = ... 
val something : Array[(Seq[String], Map[Seq[String], Double])] = ... 
val pattern : String = ... 

Die meiste Zeit Sie Namen Referenzen/mathods schnell (visuell), nicht Typen finden müssen.