ब्रेसिज़ और कोष्ठक के बीच स्काला में औपचारिक अंतर क्या है, और उनका उपयोग कब किया जाना चाहिए?


329

कोष्ठक ()और ब्रेसिज़ में कार्यों के लिए तर्क देने के बीच औपचारिक अंतर क्या है {}?

स्कैला किताब में प्रोग्रामिंग से मुझे जो एहसास हुआ है वह यह है कि स्काला काफी सुंदर है और मुझे उसकी पसंद का उपयोग करना चाहिए, लेकिन मुझे लगता है कि कुछ मामले संकलन करते हैं जबकि अन्य नहीं।

उदाहरण के लिए (सिर्फ एक उदाहरण के रूप में; मैं किसी भी प्रतिक्रिया की सराहना करता हूं जो सामान्य मामले पर चर्चा करती है, केवल इस विशेष उदाहरण पर नहीं):

val tupleList = List[(String, String)]()
val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 )

=> त्रुटि: सरल अभिव्यक्ति की अवैध शुरुआत

val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 }

=> ठीक है।

जवाबों:


365

मैंने एक बार इस बारे में लिखने की कोशिश की थी, लेकिन मैंने अंत में हार मान ली, क्योंकि नियम कुछ अलग हैं। मूल रूप से, आपको इसे लटका देना होगा।

शायद यह ध्यान केंद्रित करने के लिए सबसे अच्छा है कि घुंघराले ब्रेसिज़ और कोष्ठक का उपयोग कहां से किया जा सकता है: जब कॉल करने के लिए पैरामीटर गुजरते हैं। आप कोष्ठक ब्रेसिज़ के साथ कोष्ठक की जगह ले सकते हैं यदि, और केवल अगर, विधि एक एकल पैरामीटर की अपेक्षा करती है। उदाहरण के लिए:

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) }

इसलिए, मुझे उम्मीद है कि इससे मदद मिलेगी।


53
यही कारण है कि लोग तर्क देते हैं कि स्काला जटिल है। मैं खुद को एक स्काला उत्साही कहूंगा।
andyczerwonka

मुझे लगता है कि स्काला कोड को सरल बनाने के लिए हर तरीके के लिए एक गुंजाइश पेश करने की आवश्यकता नहीं है! आदर्श रूप से किसी भी विधि का उपयोग नहीं करना चाहिए {}- सब कुछ एक ही शुद्ध अभिव्यक्ति होना चाहिए
samthebest

1
@andyczerwonka मैं पूरी तरह से सहमत हूं लेकिन यह स्वाभाविक और अपरिहार्य मूल्य (?) है जो आप लचीलेपन और अभिव्यंजक शक्ति के लिए भुगतान करते हैं => स्काला अधिक नहीं है। यह किसी भी विशेष स्थिति के लिए सही विकल्प है, निश्चित रूप से एक और मामला है।
अशोकन ख। नाज़री

नमस्कार, जब आप कहते हैं कि List{1, 2, 3}.reduceLeft(_ + _)यह अमान्य है, तो क्या इसका मतलब है कि इसमें सिंटैक्स गलत है? लेकिन मुझे पता है कि कोड संकलित किया जा सकता है। मैंने अपना कोड यहाँ
केल्विन

आपने List(1, 2, 3)इसके बजाय सभी उदाहरणों में उपयोग किया List{1, 2, 3}। काश, स्काला के वर्तमान संस्करण (2.13) पर, यह एक अलग त्रुटि संदेश (अप्रत्याशित अल्पविराम) के साथ विफल हो जाता है। मूल त्रुटि पाने के लिए आपको 2.7 या 2.8 पर वापस जाना होगा, शायद।
डैनियल सी। सोबरल

56

यहाँ पर कुछ अलग-अलग नियम और इंफ़ेक्शन चल रहे हैं: सबसे पहले, स्काला ब्रेसिज़ को संक्रमित करता है जब एक पैरामीटर एक फ़ंक्शन होता है, जैसे list.map(_ * 2)ब्रेसिज़ में अनुमान लगाया जाता है, यह सिर्फ एक छोटा रूप है list.map({_ * 2})। दूसरे, स्केला आपको अंतिम पैरामीटर सूची में कोष्ठक को छोड़ने की अनुमति देता है, यदि उस पैरामीटर सूची में एक पैरामीटर है और यह एक फ़ंक्शन है, इसलिए list.foldLeft(0)(_ + _)इसे list.foldLeft(0) { _ + _ }(या list.foldLeft(0)({_ + _})यदि आप अतिरिक्त स्पष्ट होना चाहते हैं) लिखा जा सकता है ।

हालाँकि, यदि आप जोड़ते caseहैं, तो जैसा कि दूसरों ने उल्लेख किया है, एक फ़ंक्शन के बजाय एक आंशिक फ़ंक्शन, और स्काला आंशिक कार्यों के लिए ब्रेसिज़ का अनुमान नहीं लगाएगा, इसलिए list.map(case x => x * 2)काम नहीं करेगा, लेकिन दोनों list.map({case x => 2 * 2})और list.map { case x => x * 2 }करेंगे।


4
अंतिम पैरामीटर सूची का ही नहीं। उदाहरण के लिए, list.foldLeft{0}{_+_}काम करता है।
डैनियल सी। सोबरल

1
आह, मुझे यकीन था कि मैंने पढ़ा था कि यह केवल अंतिम पैरामीटर सूची थी, लेकिन स्पष्ट रूप से मैं गलत था! जानकार अच्छा लगा।
थियो

23

ब्रेसिज़ और कोष्ठक के उपयोग को मानकीकृत करने के लिए समुदाय से एक प्रयास है, स्काला स्टाइल गाइड (पृष्ठ 21) देखें: http://www.codecommit.com/scala-style-guide.pdf

उच्चतर ऑर्डर विधियों के लिए अनुशंसित सिंटैक्स को हमेशा ब्रेसिज़ का उपयोग करना और डॉट को छोड़ना है:

val filtered = tupleList takeWhile { case (s1, s2) => s1 == s2 }

"सामान्य" मेट्रो कॉल के लिए आपको डॉट और कोष्ठक का उपयोग करना चाहिए।

val result = myInstance.foo(5, "Hello")

18
वास्तव में सम्मेलन गोल ब्रेसिज़ का उपयोग करना है, यह लिंक गैर-आधिकारिक है। ऐसा इसलिए है क्योंकि कार्यात्मक प्रोग्रामिंग में सभी कार्य केवल प्रथम क्रम के नागरिक हैं और इसलिए उन्हें अलग तरह से व्यवहार नहीं किया जाना चाहिए। दूसरी तरह मार्टिन ओडस्की कहते हैं कि आपको केवल ऑपरेटर जैसे तरीकों (जैसे +, --) के लिए इन्फिक्स का उपयोग करने की कोशिश करनी चाहिए , जैसे नियमित तरीके नहीं takeWhile। इन्फिक्स नोटेशन का पूरा बिंदु डीएसएल और कस्टम ऑपरेटरों को अनुमति देना है, इसलिए किसी को इस संदर्भ में इसका उपयोग नहीं करना चाहिए।
samthebest

17

मुझे नहीं लगता कि स्काला में घुंघराले ब्रेसिज़ के बारे में कुछ विशेष या जटिल है। स्काला में उनके उपयोग-जटिल उपयोग को समझने के लिए, बस कुछ बातों का ध्यान रखें:

  1. घुंघराले ब्रेसिज़ कोड का एक ब्लॉक बनाते हैं, जो कोड की अंतिम पंक्ति का मूल्यांकन करता है (लगभग सभी भाषाएँ ऐसा करती हैं)
  2. एक फ़ंक्शन यदि वांछित कोड के ब्लॉक के साथ उत्पन्न किया जा सकता है (नियम 1 का अनुसरण करता है)
  3. घुंघराले ब्रेसिज़ को एक मामले के खंड (स्काला विकल्प) को छोड़कर एक-पंक्ति कोड के लिए छोड़ा जा सकता है
  4. कोष्ठक को पैरामीटर (स्कैला पसंद) के रूप में कोड ब्लॉक के साथ फ़ंक्शन कॉल में छोड़ा जा सकता है

आइए उपरोक्त तीन नियमों के अनुसार कुछ उदाहरणों की व्याख्या करें:

val tupleList = List[(String, String)]()
// doesn't compile, violates case clause requirement
val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 ) 
// block of code as a partial function and parentheses omission,
// i.e. tupleList.takeWhile({ case (s1, s2) => s1 == s2 })
val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 }

// curly braces omission, i.e. List(1, 2, 3).reduceLeft({_+_})
List(1, 2, 3).reduceLeft(_+_)
// parentheses omission, i.e. List(1, 2, 3).reduceLeft({_+_})
List(1, 2, 3).reduceLeft{_+_}
// not both though it compiles, because meaning totally changes due to precedence
List(1, 2, 3).reduceLeft _+_ // res1: String => String = <function1>

// curly braces omission, i.e. List(1, 2, 3).foldLeft(0)({_ + _})
List(1, 2, 3).foldLeft(0)(_ + _)
// parentheses omission, i.e. List(1, 2, 3).foldLeft(0)({_ + _})
List(1, 2, 3).foldLeft(0){_ + _}
// block of code and parentheses omission
List(1, 2, 3).foldLeft {0} {_ + _}
// not both though it compiles, because meaning totally changes due to precedence
List(1, 2, 3).foldLeft(0) _ + _
// error: ';' expected but integer literal found.
List(1, 2, 3).foldLeft 0 (_ + _)

def foo(f: Int => Unit) = { println("Entering foo"); f(4) }
// block of code that just evaluates to a value of a function, and parentheses omission
// i.e. foo({ println("Hey"); x => println(x) })
foo { println("Hey"); x => println(x) }

// parentheses omission, i.e. f({x})
def f(x: Int): Int = f {x}
// error: missing arguments for method f
def f(x: Int): Int = f x

1. वास्तव में सभी भाषाओं में सच नहीं है। 4. स्काला में वास्तव में सच नहीं है। जैसे: def f (x: Int) = fx
aij

@ वैज, टिप्पणी के लिए धन्यवाद। 1 के लिए, मैं उस परिचितता का सुझाव दे रहा था जो स्काला {}व्यवहार के लिए प्रदान करता है। मैंने परिशुद्धता के लिए शब्दांकन अपडेट किया है। और 4 के लिए, यह काम के बीच ()और {}, के बीच बातचीत के कारण थोड़ा मुश्किल है def f(x: Int): Int = f {x}, और इसीलिए मेरे पास 5 वीं थी। :)
lcn

1
मुझे लगता है कि () और {} के रूप में स्कैला में ज्यादातर विनिमय करने योग्य है, सिवाय इसके कि यह अलग तरह से सामग्री को पार्स करता है। मैं सामान्य रूप से f ({x}) नहीं लिखता, इसलिए f {x} को कोष्ठकों को छोड़ने के बारे में ऐसा महसूस नहीं होता है, क्योंकि उन्हें curlies के साथ प्रतिस्थापित किया जाता है। अन्य भाषाएँ वास्तव में आपको पेरेथेस को छोड़ देती हैं, उदाहरण के लिए, fun f(x) = f xSML में मान्य है।
.िजए

@ वैज, के f {x}रूप में इलाज करना मेरे लिए f({x})एक बेहतर स्पष्टीकरण प्रतीत होता है , क्योंकि विचार करना ()और {}विनिमेय कम सहज है। वैसे, f({x})व्याख्या कुछ हद तक स्काला युक्ति (खंड 6.6) द्वारा समर्थित है:ArgumentExprs ::= ‘(’ [Exprs] ‘)’ | ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ’)’ | [nl] BlockExp
lcn

13

मुझे लगता है कि यह फ़ंक्शन कॉल में उनके उपयोग को समझने के लायक है और विभिन्न चीजें क्यों होती हैं। जैसा कि किसी ने पहले ही कहा था कि घुंघराले ब्रेसिज़ कोड के एक ब्लॉक को परिभाषित करते हैं, जो एक अभिव्यक्ति भी है, इसलिए इसे रखा जा सकता है जहां अभिव्यक्ति की उम्मीद है और इसका मूल्यांकन किया जाएगा। जब मूल्यांकन किया जाता है, तो उसके बयानों को निष्पादित किया जाता है और अंतिम विवरण मूल्य पूरे ब्लॉक मूल्यांकन (कुछ हद तक रूबी में) का परिणाम है।

उसके बाद हम निम्न कार्य कर सकते हैं:

2 + { 3 }             // res: Int = 5
val x = { 4 }         // res: x: Int = 4
List({1},{2},{3})     // res: List[Int] = List(1,2,3)

अंतिम उदाहरण केवल तीन मापदंडों के साथ एक फ़ंक्शन कॉल है, जिनमें से प्रत्येक का मूल्यांकन पहले किया जाता है।

अब यह देखने के लिए कि फ़ंक्शन कॉल के साथ यह कैसे काम करता है चलो सरल फ़ंक्शन को परिभाषित करते हैं जो एक अन्य फ़ंक्शन को पैरामीटर के रूप में लेते हैं।

def foo(f: Int => Unit) = { println("Entering foo"); f(4) }

इसे कॉल करने के लिए, हमें फंक्शन पास करने की आवश्यकता होती है, जो एक प्रकार का Int लेता है, इसलिए हम फंक्शन शाब्दिक का उपयोग कर सकते हैं और इसे f पास कर सकते हैं:

foo( x => println(x) )

अब जैसा कि पहले कहा गया था कि हम अभिव्यक्ति के स्थान पर कोड के ब्लॉक का उपयोग कर सकते हैं तो चलो इसका उपयोग करें

foo({ x => println(x) })

यहां क्या होता है कि {} के अंदर कोड का मूल्यांकन किया जाता है, और फ़ंक्शन वैल्यू को ब्लॉक मूल्यांकन के मूल्य के रूप में लौटाया जाता है, फिर यह मान फू के लिए पारित किया जाता है। यह शब्दगत रूप से पिछले कॉल के समान है।

लेकिन हम कुछ और जोड़ सकते हैं:

foo({ println("Hey"); x => println(x) })

अब हमारे कोड ब्लॉक में दो स्टेटमेंट होते हैं, और क्योंकि फू मूल्यांकन होने से पहले इसका मूल्यांकन किया जाता है, ऐसा क्या होता है कि पहले "अरे" छपा होता है, फिर हमारा फंक्शन लुभाने के लिए पास किया जाता है, "एंटरिंग फू" प्रिंट होता है और अंत में "4" प्रिंट होता है। ।

हालांकि यह थोड़ा बदसूरत लगता है और स्काला हमें इस मामले में कोष्ठक को छोड़ देने की अनुमति देता है, इसलिए हम लिख सकते हैं:

foo { println("Hey"); x => println(x) }

या

foo { x => println(x) }

यह बहुत अच्छा लग रहा है और पूर्व लोगों के बराबर है। यहां अभी भी कोड के ब्लॉक का मूल्यांकन पहले किया जाता है और मूल्यांकन का परिणाम (जो x => प्रिंट्लन (x)) है, को लुभाने के तर्क के रूप में पारित किया जाता है।


1
क्या यह केवल मैं ही हूं। लेकिन मैं वास्तव में स्पष्ट प्रकृति को पसंद करता हूं foo({ x => println(x) })। हो सकता है कि मैं भी अपने रास्ते में फंस गया हो ...
dade

7

क्योंकि आप उपयोग कर रहे हैं case, आप एक आंशिक फ़ंक्शन को परिभाषित कर रहे हैं और आंशिक कार्यों के लिए घुंघराले ब्रेस की आवश्यकता होती है।


1
मैंने इस उदाहरण के लिए सामान्य रूप से जवाब नहीं, बल्कि सामान्य रूप से उत्तर मांगा।
मार्क-फ्रांकोइस

5

Parens के साथ संकलित जाँच में वृद्धि

स्प्रे के लेखक, यह सलाह देते हैं कि गोल पार्न्स बढ़ते संकलन की जाँच करते हैं। यह स्प्रे जैसे डीएसएल के लिए विशेष रूप से महत्वपूर्ण है। Parens का उपयोग करके आप संकलक को बता रहे हैं कि इसे केवल एक ही लाइन दी जानी चाहिए, इसलिए यदि आपने गलती से इसे दो या अधिक दिया है, तो यह शिकायत करेगा। अब यह घुंघराले ब्रेसिज़ के साथ ऐसा नहीं है, उदाहरण के लिए, यदि आप एक ऑपरेटर को भूल जाते हैं तो कहीं न कहीं आपका कोड संकलित होगा, आपको अप्रत्याशित परिणाम मिलेंगे और संभवतः एक बहुत ही मुश्किल बग ढूंढना होगा। नीचे लिखा हुआ है (क्योंकि भाव शुद्ध हैं और कम से कम चेतावनी देंगे), लेकिन बात बनाता है

method {
  1 +
  2
  3
}

method(
  1 +
  2
  3
 )

पहला संकलन, दूसरा देता है error: ')' expected but integer literal found.जो लेखक लिखना चाहता था 1 + 2 + 3

एक तर्क दे सकता है कि यह डिफ़ॉल्ट तर्कों के साथ बहु-पैरामीटर तरीकों के लिए समान है; Parens का उपयोग करते समय गलती से अलग मापदंडों के अल्पविराम को भूलना असंभव है।

शब्दाडंबर

वर्बोसिटी के बारे में एक महत्वपूर्ण अक्सर अनदेखी नोट। घुंघराले ब्रेसिज़ का उपयोग अनिवार्य रूप से वर्बोस कोड की ओर जाता है क्योंकि स्कैला स्टाइल गाइड स्पष्ट रूप से बताता है कि घुंघराले ब्रेसिज़ को अपनी लाइन पर होना चाहिए: http://docs.scala-lang.org/style/declarations.html "... समापन ब्रेस फ़ंक्शन की अंतिम पंक्ति के तुरंत बाद अपनी लाइन पर है। " कई ऑटो-सुधारक, जैसे इंटेलीज में, स्वचालित रूप से आपके लिए इस सुधार का प्रदर्शन करेंगे। तो जब आप कर सकते हैं दौर parens का उपयोग करने के लिए छड़ी की कोशिश करो। जैसे List(1, 2, 3).reduceLeft{_ + _}बन जाता है:

List(1, 2, 3).reduceLeft {
  _ + _
}

-2

ब्रेसिज़ के साथ, आपको अर्धविराम आपके लिए प्रेरित किया गया और कोष्ठक नहीं। takeWhileफ़ंक्शन पर विचार करें , क्योंकि यह आंशिक फ़ंक्शन की अपेक्षा करता है, केवल {case xxx => ??? }मामले की अभिव्यक्ति के आसपास कोष्ठक के बजाय मान्य परिभाषा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.