2010-09-01 8 views
23

Ich bin ziemlich neu zu Scala, aber ich dachte, dass eine der Stärken der Sprache war, die Zeremonie zu entfernen, wie Klammern und Punkte, die in zum Beispiel Java existieren. So war ich ziemlich verwirrt, als ich entdeckte, dass ich zum Beispiel schreiben könnenWarum kann ich println "Hallo Welt" nicht in Scala schreiben?

str1 equals str2 

aber nicht

println "Hello world" 

Ich habe vermutet, dass es etwas damit zu tun hat, das erste Beispiel drei „Teile“ hat, aber die Sekunde hat nur zwei, aber ich bemühe mich zu verstehen, warum es so ist.

+1

Syntax ist Zeremonie? –

Antwort

51

Wenn es nur zwei Teile gibt, wird der Ausdruck als Methodenaufruf angesehen. I.e. die einzige Möglichkeit für

println "Hello, world" 

println."Hello, world" 

wäre, was natürlich viel Sinn hier nicht machen. (***** siehe unten für eine Ergänzung)

Wenn Sie möchten, können Sie jedoch Console println "Hello, World" schreiben, um die Mehrdeutigkeit zu beheben.

ist es nicht, dass ambigus im String Beispiel aussehen, eine Zeichenfolge kaum ein Methodenname sein könnte, aber denken Sie an den folgenden:

class B 
val b = new B 

object A { 
    def apply(myB: B) { print("apply") } 
    def b { print("b") } 
} 

Nun, wenn A b schreiben, was bekomme ich. Wie sollte es interpretiert werden? Es stellt sich heraus, dass:

So gibt es eine klare Regel, was in einem zweiteiligen Ausdruck zu tun. (Ich hoffe, niemand beginnt Haarspalterei über apply und echte Methodenaufruf ...)

Zusatz

Mit dem Aufkommen von dynamischen Klassen, können Sie Spielzeug ein wenig herum und definieren die folgenden

object println extends Dynamic { 
    def typed[T] = asInstanceOf[T] 
    def applyDynamic(name: String)(args: Any*) = Console.println(name) 
} 

Und jetzt schau !, keine Klammern:

println `Hello, world` // prints, "Hello, world" 

Natürlich bitte tun Sie das nicht in f ront von Kindern oder im realen Code.

+0

Wow, deine Antwort ist so gut, dass sie alle anderen verdrängt hat! – drozzy

5

Sie könnten Ihr zweites Beispiel mit drei „Teilen“ umschreiben, in welchem ​​Fall es ohne Klammern zusammenstellen würde: (! Nur zu Veranschaulichungszwecken - @ Debilski Antwort ist perfekt)

Predef println "Hello world" 

+0

+1 Ersetzen von 'println (...)' mit 'Predef println' ist in gewisser Weise korrekter als mit' Console println'. – Debilski