2011-09-23 8 views
9

यहां कोष्ठक की आवश्यकता क्यों है? क्या मुझे कुछ प्राथमिकता नियम पता होना चाहिए?स्कैला: क्या आप ब्रांड्स के बिना अभिव्यक्ति में "foo match {bar}" का उपयोग कर सकते हैं?

scala> 'x' match { case _ => 1 } + 1 
<console>:1: error: ';' expected but identifier found. 
     'x' match { case _ => 1 } + 1 
           ^

scala> ('x' match { case _ => 1 }) + 1 
res2: Int = 2 

धन्यवाद!

+0

एक लालसा क्या है? :-) – soc

+0

सोशल: मैंने शीर्षक को और अधिक समझने योग्य में बदल दिया। –

उत्तर

3

एक मिलान अभिव्यक्ति को सरल अभिव्यक्ति के रूप में नहीं माना जाता है। यहां एक समान उदाहरण दिया गया है:

scala> val foo = "bar" + if(3 < 5) 3 else 5 // does not compile 
scala> val foo = "bar" + (if(3 < 5) 3 else 5) // does compile 

स्पष्ट रूप से आप जहां चाहें जटिल अभिव्यक्तियां नहीं लिख सकते हैं। मुझे नहीं पता कि क्यों और उम्मीद है कि इस विषय के अधिक ज्ञान वाले व्यक्ति आपको बेहतर उत्तर देंगे।

8

जैसा कि एग्जिस्टेल कहते हैं, एक मैच को सरल अभिव्यक्ति के रूप में नहीं माना जाता है, न ही एक कथन है, इसलिए आपको अभिव्यक्ति को कोष्ठक से घिरा होना चाहिए। The Scala Language Specification से, 6 अभिव्यक्तियां, पी 73, मैच एक एक्सप्र है, जैसा कि एक है। केवल SimpleExpr + ऑपरेटर के दोनों ओर स्वीकार किए जाते हैं।

एक एक्स्प्रेस को एक SimpleExpr में परिवर्तित करने के लिए, आपको इसे() से घिरा करना होगा।

संपूर्णता के लिए कॉपी किया गया:

Expr ::= (Bindings | id | ‘_’) ‘=>’ Expr 
    | Expr1 
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] else Expr] 
    | ‘while’ ‘(’ Expr ‘)’ {nl} Expr 
    | ‘try’ ‘{’ Block ‘}’ [‘catch’ ‘{’ CaseClauses ‘}’] [‘finally’ Expr] 
    | ‘do’ Expr [semi] ‘while’ ‘(’ Expr ’)’ 
    | ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’) {nl} [‘yield’] Expr 
    | ‘throw’ Expr 
    | ‘return’ [Expr] 
    | [SimpleExpr ‘.’] id ‘=’ Expr 
    | SimpleExpr1 ArgumentExprs ‘=’ Expr 
    | PostfixExpr 
    | PostfixExpr Ascription 
    | PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’ 
PostfixExpr ::= InfixExpr [id [nl]] 
InfixExpr ::= PrefixExpr 
    | InfixExpr id [nl] InfixExpr 
PrefixExpr ::= [‘-’ | ‘+’ | ‘~’ | ‘!’] SimpleExpr 
SimpleExpr ::= ‘new’ (ClassTemplate | TemplateBody) 
    | BlockExpr 
    | SimpleExpr1 [‘_’] 
SimpleExpr1 ::= Literal 
    | Path 
    | ‘_’ 
    | ‘(’ [Exprs] ‘)’ 
    | SimpleExpr ‘.’ id s 
    | SimpleExpr TypeArgs 
    | SimpleExpr1 ArgumentExprs 
    | XmlExpr 
Exprs ::= Expr {‘,’ Expr} 
BlockExpr ::= ‘{’ CaseClauses ‘}’ 
    | ‘{’ Block ‘}’ 
Block ::= {BlockStat semi} [ResultExpr] 
ResultExpr ::= Expr1 
    | (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Ascription ::= ‘:’ InfixType 
    | ‘:’ Annotation {Annotation} 
    | ‘:’ ‘_’ ‘*’ 
5

स्काला विनिर्देश में कुछ निरीक्षण के बाद, मुझे लगता है कि मैं इसे एक शॉट दे सकते हैं। यदि मैं गलत हूं तो कृपया मुझे सही करें।

पहले, if या match को Expr - अभिव्यक्तियों के रूप में परिभाषित किया गया है।

आप एक इन्फ़िक्स अभिव्यक्ति (दो भाव के बीच ऑपरेटर के उपयोग द्वारा परिभाषित)

बनाने के लिए हालांकि especification (खंड 3.2.8) में कहा गया कोशिश कर रहे हैं कि:

fi x ऑपरेटरों के सभी प्रकार वही प्राथमिकता है; कोष्ठक को

समूहीकरण के लिए इस्तेमाल किया जा है यह भी यह भी कहा गया है कि:

fi x संचालन t0 OP1 t1 op2 में लगातार प्रकार के अनुक्रम में। । । ओपन टीएन, सभी ऑपरेटरों op1,। । । , ओपन में सहयोगी होना चाहिए। यदि वे सभी बाएं-सहयोगी हैं, तो अनुक्रम (...। (T0 op1 t1) op2 ... के रूप में व्याख्या किया गया है।) Opn tn।

तो मेरा लेना यह है कि स्कैला को यह नहीं पता कि पहले क्या कम करना है: मैच या विधि '+' आमंत्रण।

इस answer

पर एक नजर डालें कृपया मुझे सही कर अगर मैं गलत हूँ।

+1

धन्यवाद! यह मेरे लिए वाक्यविन्यास में एक निरीक्षण की तरह लगता है। और '' ('[Exprs]' 'पर spec का हिस्सा' '(धारा 6.9: ट्यूपल) उस मामले के बारे में बात नहीं करता है जहां कोष्ठक के बीच केवल एक अभिव्यक्ति है, क्या इसे कहीं और परिभाषित किया गया है? –

+0

आपका स्वागत है।स्केल सिंटेक्स सारांश (पृष्ठ 162) में http://www.scala-lang.org/docu/files/ScalaReference.pdf Exprs को expr {',' Expr} के रूप में परिभाषित किया गया है जो अभिव्यक्ति की पुनरावृत्ति का प्रतिनिधित्व करता है (http: //en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form)। तो यह एक अभिव्यक्ति या दोहराए गए अभिव्यक्तियों का प्रतिनिधित्व कर सकता है। – JaimeJorge

+0

धन्यवाद लेकिन मेरा मतलब था कि 6.9 केवल कहता है 'ए टुपल एक्सप्रेशन (ई 1, ..., एन) क्लास इंस्टेंस सृजन स्कैला के लिए उपनाम है। टप्लेन (ई 1, ..., एन), जहां एन ≥ 2 खाली tuple() प्रकार का विशिष्ट मूल्य है scala.Unit.'। एन = 1 मामले का उल्लेख नहीं है। वास्तव में –

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

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