कक्षा परिभाषाएँ:
val
या var
वर्ग मापदंडों से छोड़ा जा सकता है जो पैरामीटर को निजी बना देगा।
Var या val को जोड़ने से यह सार्वजनिक हो जाएगा (अर्थात, विधि अभिगमकर्ता और उत्परिवर्ती उत्पन्न होते हैं)।
{}
छोड़ा जा सकता है यदि वर्ग का कोई शरीर नहीं है, अर्थात
class EmptyClass
कक्षा का समापन:
सामान्य पैरामीटर को छोड़ा जा सकता है यदि वे संकलक द्वारा अनुमान लगाया जा सकता है। हालाँकि, ध्यान दें, यदि आपके प्रकार मेल नहीं खाते हैं, तो टाइप पैरामीटर हमेशा अनुमानित है ताकि यह मेल खाता हो। तो प्रकार निर्दिष्ट किए बिना, आपको वह नहीं मिल सकता है जो आप अपेक्षा करते हैं - जो कि दिया गया है
class D[T](val x:T, val y:T);
यह आपको एक प्रकार की त्रुटि देगा (Int पाया गया, अपेक्षित स्ट्रिंग)
var zz = new D[String]("Hi1", 1) // type error
जबकि यह ठीक काम करता है:
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
क्योंकि टाइप पैरामीटर, T, दो के कम से कम सामान्य सुपरटेप के रूप में अनुमानित है - कोई भी।
कार्य की परिभाषा:
=
अगर फंक्शन यूनिट (कुछ भी नहीं) लौटाया जा सकता है।
{}
फ़ंक्शन बॉडी के लिए छोड़ा जा सकता है यदि फ़ंक्शन एक एकल स्टेटमेंट है, लेकिन केवल तभी जब स्टेटमेंट एक मान लौटाता है (आपको =
संकेत की आवश्यकता है ), अर्थात,
def returnAString = "Hi!"
लेकिन यह काम नहीं करता है:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
यदि यह अनुमान लगाया जा सकता है कि फ़ंक्शन का रिटर्न प्रकार छोड़ा जा सकता है (एक पुनरावर्ती विधि में इसका रिटर्न प्रकार निर्दिष्ट होना चाहिए)।
()
यदि फ़ंक्शन कोई तर्क नहीं लेता है, तो उसे गिराया जा सकता है,
def endOfString {
return "myDog".substring(2,1)
}
जो अधिवेशन उन तरीकों के लिए आरक्षित है जिनके कोई दुष्प्रभाव नहीं हैं - बाद में और अधिक।
()
पैरामेंटर नाम से पास को परिभाषित करते समय वास्तव में प्रति सेशन नहीं गिराया जाता है , लेकिन यह वास्तव में काफी शब्दार्थ से अलग नोटेशन है,
def myOp(passByNameString: => String)
कहते हैं, myOp एक पास-बाय-नाम पैरामीटर लेता है, जिसके परिणामस्वरूप स्ट्रिंग (जो है, यह एक कोड ब्लॉक हो सकता है जो एक स्ट्रिंग लौटाता है) फ़ंक्शन मापदंडों के विपरीत,
def myOp(functionParam: () => String)
जो कहता myOp
है कि एक फ़ंक्शन है जिसमें शून्य पैरामीटर हैं और एक स्ट्रिंग लौटाता है।
(माइंड यू, पास-बाय-नेम पैरामीटर फंक्शंस में संकलित हो जाता है; यह सिंटैक्स को अच्छा बनाता है।)
()
फ़ंक्शन पैरामीटर परिभाषा में गिराया जा सकता है यदि फ़ंक्शन केवल उदाहरण के लिए एक तर्क लेता है:
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
लेकिन अगर यह एक से अधिक तर्क लेता है, तो आपको () शामिल होना चाहिए:
def myOp2(passByNameString:(Int, String) => String) { .. }
कथन:
.
ऑपरेटर संकेतन का उपयोग करने के लिए गिराया जा सकता है, जिसका उपयोग केवल इन्फिक्स ऑपरेटरों (तर्कों को लेने वाले तरीकों के ऑपरेटरों) के लिए किया जा सकता है। देखें डैनियल जवाब में अधिक जानकारी के लिए।
.
उपसर्ग फ़ंक्शंस लिस्ट टेल के लिए भी छोड़ा जा सकता है
()
उपसर्ग ऑपरेटरों की सूची के लिए गिराया जा सकता है। टेल
()
के रूप में परिभाषित तरीकों के साथ इस्तेमाल नहीं किया जा सकता है:
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
क्योंकि यह नोटेशन उन तरीकों के लिए कन्वेंशन द्वारा आरक्षित है, जिनका कोई साइड इफेक्ट नहीं है, जैसे कि लिस्ट # टेल (यानी बिना साइड इफेक्ट के किसी फंक्शन का इनवॉइस का मतलब है कि फंक्शन का कोई ऑब्जर्वेबल इफेक्ट नहीं है, सिवाय इसके रिटर्न वैल्यू के)।
()
एक तर्क में पास होने पर ऑपरेटर संकेतन के लिए छोड़ा जा सकता है
()
पोस्टफ़िक्स ऑपरेटरों का उपयोग करने की आवश्यकता हो सकती है जो एक बयान के अंत में नहीं हैं
()
नेस्टेड स्टेटमेंट, अनाम फ़ंक्शंस के सिरों या एक से अधिक पैरामीटर लेने वाले ऑपरेटरों के लिए आवश्यक हो सकता है
एक फ़ंक्शन को कॉल करते समय जो एक फ़ंक्शन लेता है, आप आंतरिक फ़ंक्शन परिभाषा से () को छोड़ नहीं सकते, उदाहरण के लिए:
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
किसी फ़ंक्शन को जब एक उप-नाम पैरामीटर लेता है, तो आप तर्क को पैरामीटर-कम अनाम फ़ंक्शन के रूप में निर्दिष्ट नहीं कर सकते। उदाहरण के लिए, दिया गया:
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
आपको इसे कॉल करना होगा:
myOp("myop3")
या
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
लेकिन नहीं:
myOp(() => "myop3") // Doesn't work
IMO, रिटर्न प्रकारों को छोड़ने का अधिक उपयोग कोड को फिर से उपयोग करने के लिए हानिकारक हो सकता है। कोड में स्पष्ट जानकारी की कमी के कारण कम पठनीयता के अच्छे उदाहरण के लिए विनिर्देश देखें। अप्रत्यक्ष के स्तरों की संख्या वास्तव में यह पता लगाने के लिए कि चर का प्रकार क्या हो सकता है। उम्मीद है कि बेहतर उपकरण इस समस्या को हल कर सकते हैं और हमारे कोड को संक्षिप्त रख सकते हैं।
(ठीक है, एक और अधिक पूर्ण, संक्षिप्त उत्तर संकलित करने के लिए (यदि मैंने कुछ भी याद किया है, या कुछ गलत / गलत टिप्पणी दी है), तो मैंने उत्तर की शुरुआत में जोड़ा है। कृपया ध्यान दें कि यह कोई भाषा नहीं है। विनिर्देश, इसलिए मैं इसे अकादमिक रूप से सही बनाने की कोशिश नहीं कर रहा हूं - केवल संदर्भ कार्ड की तरह।)