2010-09-01 14 views
23

मैं स्कैला के लिए काफी नया हूं, लेकिन मैंने सोचा कि भाषा की ताकतें समारोह को हटाने के लिए थीं, जैसे कि ब्रांड्स और डॉट्स, जो जावा के लिए मौजूद हैं। तो मैं बहुत उलझन में जब मुझे पता चला कि मैं उदाहरणमैं स्कैला में प्रिंटल "हैलो वर्ल्ड" क्यों नहीं लिख सकता?

str1 equals str2 

के लिए लिख सकते हैं लेकिन

नहीं
println "Hello world" 

मैं अनुमान लगाया है कि यह पहला उदाहरण तीन "भागों" है के साथ क्या करना है कि कुछ किया गया था, लेकिन दूसरे में केवल दो हैं, लेकिन मैं समझने के लिए संघर्ष कर रहा हूं कि ऐसा क्यों है।

+1

सिंटेक्स समारोह है? –

उत्तर

51

जब केवल दो भाग होते हैं, अभिव्यक्ति विधि आमंत्रण के रूप में देखी जाती है। अर्थात। के लिए

println "Hello, world" 

केवल संभावना

println."Hello, world" 

जो निश्चित रूप से यहां ज्यादा मतलब नहीं है किया जाएगा। (***** एक अतिरिक्त के लिए नीचे देखें)

यदि आप चाहें, तो आप अस्पष्टता को हल करने के लिए Console println "Hello, World" लिख सकते हैं।

यह स्ट्रिंग उदाहरण में है कि ambigus नहीं लगती है, एक स्ट्रिंग मुश्किल से एक विधि नाम हो सकता है, लेकिन निम्न के बारे में सोच: जब A b लेखन

class B 
val b = new B 

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

अब,, मैं क्या मिलता है। इसका व्याख्या कैसे किया जाना चाहिए? यह पता चला है कि:

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

तो, एक स्पष्ट नियम है कि दो भाग अभिव्यक्ति में क्या करना है। (मुझे आशा है कि कोई भी नहीं apply और वास्तविक विधि मंगलाचरण ... के बारे में बंटवारे बाल शुरू होता है)

अलावा

गतिशील कक्षाओं के आगमन के साथ, एक छोटे से चारों ओर खिलौना आप कर सकते हैं और परिभाषित निम्नलिखित

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

और अब देखो !, कोई कोष्ठकों:

println `Hello, world` // prints, "Hello, world" 
बेशक

, ऐसा नहीं करते हैं तो कृपया च में है कि बच्चों या वास्तविक जीवन कोड में नहीं।

+0

वाह, आपका जवाब इतना अच्छा है कि उसने अन्य सभी को विस्थापित कर दिया है! – drozzy

5

आप तीन "भागों", जिस स्थिति में वह कोष्ठकों में संकलित हैं के साथ अपने दूसरे उदाहरण पुनर्लेखन सकता है: (! बस समझाने के उद्देश्य से - @ Debilski के जवाब एकदम सही है)

Predef println "Hello world" 

+0

+1 'println (...) 'को' प्रिडफ प्रिंटलएन 'के साथ बदलकर' कंसोल println' का उपयोग करने से कहीं अधिक सही है। – Debilski

संबंधित मुद्दे