2010-09-01 14 views
23

Sono piuttosto nuovo di Scala, ma ho pensato che uno dei punti di forza del linguaggio era rimuovere la cerimonia, come parentesi e punti, che esiste ad esempio in Java. Quindi ero abbastanza confuso quando ho scoperto che posso scrivere per esempioPerché non riesco a scrivere println "Hello world" in Scala?

str1 equals str2 

ma non

println "Hello world" 

ho ipotizzato che ha qualcosa a che fare con quella del primo esempio ha tre "parti", ma il secondo ne ha solo due, ma mi sto sforzando di capire perché sia ​​così.

+1

Sintassi è la cerimonia? –

risposta

51

Quando ci sono solo due parti, l'espressione è vista come invocazione del metodo. Cioè l'unica possibilità per

println "Hello, world" 

sarebbe

println."Hello, world" 

che ovviamente non ha molto senso qui. (***** vedi sotto per un'aggiunta)

Se ti piace, tuttavia, puoi scrivere Console println "Hello, World" per risolvere l'ambiguità.

Non sembra che ambigus nell'esempio di stringa, una stringa non potrebbe essere un nome di metodo, ma pensare al seguente:

class B 
val b = new B 

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

Ora, quando si scrive A b, cosa ottengo. Come dovrebbe essere interpretato? Si scopre che:

A b // "b" 
A.b // "b" 
A(b) // apply 

Quindi, c'è una regola chiara su cosa fare in un'espressione in due parti. (Spero che nessuno inizia a spaccare il capello su apply e vero e proprio metodo invocazione ...)

aggiunta

Con l'avvento delle classi dinamiche, si può giocare in giro un po 'e definire quanto segue

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

E ora guarda !, nessuna parentesi:

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

Naturalmente, per favore non farlo in f ront of children o nel codice della vita reale.

+0

Wow, la tua risposta è così buona che ha spostato tutti gli altri! – drozzy

5

Si potrebbe riscrivere il vostro secondo esempio con tre "parti", nel qual caso sarebbe compilare senza parentesi: (! Solo a scopo illustrativo - @ risposta di Debilski è perfetto)

Predef println "Hello world" 

+0

+1 Sostituire 'println (...)' con 'Predef println' è in un modo più corretto rispetto all'uso di' Console println'. – Debilski