2010-09-01 19 views
23

Scala'da oldukça yeniyim, ama dilin güçlü yönlerinden birinin, örneğin Java'da bulunan parantez ve noktalar gibi seremoniyi kaldırmak olduğunu düşündüm. Ben meselaScala'da neden "Merhaba dünya" yazıyor?

str1 equals str2 

için yazabilir ancak

println "Hello world" 

Ben ilk örnek üç "parçaları" olduğunu bir ilgisi olduğunu tahmin ettiğiniz keşfetti Yani ben çok karışıktı, ama ikincisi sadece iki tane var, ama neden böyle olduğunu anlamaya çalışıyorum.

+1

Dizimi tören mi –

cevap

51

Sadece iki bölüm olduğunda, ifade yöntem çağırma olarak görülür. Yani

println "Hello, world" 

için tek olasılık elbette burada pek mantıklı değil

println."Hello, world" 

olurdu. (***** bir ek için aşağıya bakın)

İsterseniz, belirsizliği gidermek için Console println "Hello, World" yazabilirsiniz.

Bu dize örnekte olduğu ambigus görünmüyor, bir dize pek yöntem adı olabilir ama şu düşünebildiğim: Artık

class B 
val b = new B 

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

, A b yazarken, ne alabilirim. Nasıl yorumlanmalı? Bu şu anlama gelir: İki bölümlü bir ifadede ne yapılacağına dair net bir kural vardır. Biraz etrafında yapabilirsiniz oyuncak, dinamik sınıfların ortaya çıkışıyla

ilavesi

(Ben kimsenin apply ve reel metot çağrımı ... hakkında bölme kıllar başlar umut) ve tanımlamak aşağıdaki

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

Ve şimdi, bak !, parantez yok:

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

Elbette, lütfen bunu f Çocukların ya da gerçek hayat kodunda.

+0

Vay, cevabın o kadar iyi ki, diğerlerini yerinden etti! – drozzy

5

Bunu parantez olmadan derlemek hangi durumda üç "parça", ile ikinci örnek yazabilirsiniz: (! Sadece gösterim amaçlı - Debilski cevabı mükemmel @)

Predef println "Hello world" 

+0

+1 'printn (...)' 'Predef println' ile değiştirilmesi,' Console println' kullanılmasından daha doğrudur. – Debilski