मैंने एक बार इस बारे में लिखने की कोशिश की थी, लेकिन मैंने अंत में हार मान ली, क्योंकि नियम कुछ अलग हैं। मूल रूप से, आपको इसे लटका देना होगा।
शायद यह ध्यान केंद्रित करने के लिए सबसे अच्छा है कि घुंघराले ब्रेसिज़ और कोष्ठक का उपयोग कहां से किया जा सकता है: जब कॉल करने के लिए पैरामीटर गुजरते हैं। आप कोष्ठक ब्रेसिज़ के साथ कोष्ठक की जगह ले सकते हैं यदि, और केवल अगर, विधि एक एकल पैरामीटर की अपेक्षा करती है। उदाहरण के लिए:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
हालाँकि, इन नियमों को बेहतर ढंग से समझने के लिए आपको और अधिक जानने की आवश्यकता है।
Parens के साथ संकलित जाँच में वृद्धि
स्प्रे के लेखक गोल पार्न्स की सलाह देते हैं क्योंकि वे बढ़ते संकलन की जांच करते हैं। यह स्प्रे जैसे डीएसएल के लिए विशेष रूप से महत्वपूर्ण है। Parens का उपयोग करके आप संकलक को बता रहे हैं कि इसे केवल एक ही लाइन दी जानी चाहिए; इसलिए यदि आप गलती से इसे दो या अधिक देते हैं, तो यह शिकायत करेगा। अब घुंघराले ब्रेसिज़ के साथ ऐसा नहीं है - उदाहरण के लिए यदि आप एक ऑपरेटर को कहीं भूल जाते हैं, तो आपका कोड संकलित करेगा, और आपको अप्रत्याशित परिणाम मिलेंगे और संभवतः एक बहुत ही कठिन बग ढूंढना होगा। नीचे लिखा है (क्योंकि भाव शुद्ध हैं और कम से कम चेतावनी देंगे), लेकिन बात यह है:
method {
1 +
2
3
}
method(
1 +
2
3
)
पहला संकलन करता है, दूसरा देता है error: ')' expected but integer literal found
। लेखक लिखना चाहता था 1 + 2 + 3
।
एक तर्क दे सकता है कि यह डिफ़ॉल्ट तर्कों के साथ बहु-पैरामीटर तरीकों के लिए समान है; Parens का उपयोग करते समय गलती से अलग मापदंडों के अल्पविराम को भूलना असंभव है।
शब्दाडंबर
वर्बोसिटी के बारे में एक महत्वपूर्ण अक्सर अनदेखी नोट। घुंघराले ब्रेसिज़ का उपयोग अनिवार्य रूप से वर्बोज़ कोड की ओर जाता है क्योंकि स्काला स्टाइल गाइड स्पष्ट रूप से बताता है कि घुंघराले ब्रेसिज़ को बंद करना अपनी लाइन पर होना चाहिए:
... समापन ब्रेस फ़ंक्शन की अंतिम पंक्ति के तुरंत बाद अपनी लाइन पर है।
कई ऑटो-सुधारक, जैसे कि इंटेलीज में, आपके लिए इस सुधार को स्वचालित रूप से करेंगे। तो जब आप कर सकते हैं दौर parens का उपयोग करने के लिए छड़ी की कोशिश करो।
Infix संकेतन
इन्फिक्स नोटेशन का उपयोग करते समय, जैसे कि List(1,2,3) indexOf (2)
आप कोष्ठक को छोड़ सकते हैं यदि केवल एक पैरामीटर है और इसे लिखें List(1, 2, 3) indexOf 2
। यह डॉट-नोटेशन का मामला नहीं है।
ध्यान दें कि जब आपके पास एक एकल पैरामीटर है जो एक बहु-टोकन अभिव्यक्ति है, जैसे x + 2
या a => a % 2 == 0
, आपको अभिव्यक्ति की सीमाओं को इंगित करने के लिए कोष्ठक का उपयोग करना होगा।
tuples
क्योंकि आप कोष्ठक को कभी-कभी छोड़ सकते हैं, कभी-कभी एक टपल को अतिरिक्त कोष्ठक की आवश्यकता होती है ((1, 2))
, और कभी-कभी बाहरी कोष्ठक को छोड़ा जा सकता है, जैसे कि (1, 2)
। इससे भ्रम पैदा हो सकता है।
समारोह / आंशिक समारोह शाब्दिक के साथ case
स्कैला में फ़ंक्शन और आंशिक फ़ंक्शन शाब्दिक के लिए एक सिंटैक्स है। यह इस तरह दिख रहा है:
{
case pattern if guard => statements
case pattern => statements
}
केवल अन्य स्थानों पर जहां आप उपयोग कर सकते हैं case
बयान के साथ कर रहे हैं match
और catch
कीवर्ड:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
आप case
किसी अन्य संदर्भ में बयानों का उपयोग नहीं कर सकते । तो, आप उपयोग करना चाहते हैं case
, तो आप की जरूरत है घुंघराले ब्रेसिज़। यदि आप सोच रहे हैं कि किसी फ़ंक्शन और आंशिक फ़ंक्शन शाब्दिक के बीच क्या अंतर है, तो उत्तर है: संदर्भ। यदि स्काला एक फ़ंक्शन की अपेक्षा करता है, तो एक फ़ंक्शन जो आपको मिलता है। यदि यह एक आंशिक फ़ंक्शन की अपेक्षा करता है, तो आपको आंशिक फ़ंक्शन मिलता है। यदि दोनों अपेक्षित हैं, तो यह अस्पष्टता के बारे में एक त्रुटि देता है।
अभिव्यक्ति और ब्लॉक
कोष्ठक का उपयोग उपमेय बनाने के लिए किया जा सकता है। घुंघराले ब्रेसिज़ का उपयोग कोड के ब्लॉक बनाने के लिए किया जा सकता है (यह एक फ़ंक्शन शाब्दिक नहीं है, इसलिए इसे एक की तरह उपयोग करने की कोशिश से सावधान रहें)। कोड के एक ब्लॉक में कई कथन होते हैं, जिनमें से प्रत्येक एक आयात वक्तव्य, एक घोषणा या एक अभिव्यक्ति हो सकता है। यह इस प्रकार चलता है:
{
import stuff._
statement ; // ; optional at the end of the line
statement ; statement // not optional here
var x = 0 // declaration
while (x < 10) { x += 1 } // stuff
(x % 5) + 1 // expression
}
( expression )
इसलिए, यदि आपको घोषणाओं, कई कथनों, import
या इस तरह की किसी चीज की आवश्यकता है, तो आपको घुंघराले ब्रेस की आवश्यकता है। और क्योंकि एक अभिव्यक्ति एक बयान है, कोष्ठक घुंघराले ब्रेसिज़ के अंदर दिखाई दे सकता है। लेकिन दिलचस्प बात यह है कि कोड के ब्लॉक भी अभिव्यक्ति हैं, इसलिए आप उन्हें अभिव्यक्ति के अंदर कहीं भी उपयोग कर सकते हैं :
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
इसलिए, चूंकि अभिव्यक्तियाँ कथन हैं, और कोड के ब्लॉक अभिव्यक्ति हैं, इसलिए नीचे दी गई सब कुछ मान्य है:
1 // literal
(1) // expression
{1} // block of code
({1}) // expression with a block of code
{(1)} // block of code with an expression
({(1)}) // you get the drift...
जहां वे विनिमेय नहीं हैं
मूल रूप से, आप कहीं और इसके विपरीत या इसके {}
साथ प्रतिस्थापित नहीं कर सकते ()
। उदाहरण के लिए:
while (x < 10) { x += 1 }
यह एक विधि कॉल नहीं है, इसलिए आप इसे किसी अन्य तरीके से नहीं लिख सकते। ठीक है, आप घुंघराले ब्रेसिज़ डाल सकते हैं अंदर के लिए कोष्ठक condition
के रूप में उपयोग कोष्ठक, साथ ही अंदर कोड के ब्लॉक के लिए घुंघराले ब्रेसिज़:
while ({x < 10}) { (x += 1) }
इसलिए, मुझे उम्मीद है कि इससे मदद मिलेगी।