2016-03-19 7 views
8

scala सीखने जब मैं निम्नलिखित अजीब टुकड़ा पर ठोकर खाई:स्केल किसी संख्या को अक्षर निर्दिष्ट करते समय कोई संकलन-समय त्रुटि नहीं देता है?

package temptests 

object TempTest { 
    //def 2 = 123 // does not compile 
    val 2 = 123 // compiles, but leads to an exception at runtime 

    def main(args: Array[String]) = { // just do something to load this class 
    println("Hello") 
    } 
} 

मैं उम्मीद होती है कि संकलक val 2 = 123 पर एक त्रुटि फेंक क्योंकि पहचानकर्ता अंक के साथ शुरू नहीं करना चाहिए होगा, लेकिन कोड एक चेतावनी के बिना संकलित करता है।

Exception in thread "main" java.lang.ExceptionInInitializerError at temptests.TempTest.main(TempTest.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Caused by: scala.MatchError: 123 (of class java.lang.Integer) at temptests.TempTest$.(TempTest.scala:5) at temptests.TempTest$.(TempTest.scala) ... 6 more

मैं बस उत्सुक हूँ: कैसे val 2 = 123Scala द्वारा समझा जाता है हालांकि, क्रम में इसे तुरंत एक अपवाद फेंकता है? कोई संकलन-समय त्रुटि क्यों नहीं है?

+0

मैं 100% यकीन है कि यह डुप्लिकेट है हूँ, लेकिन मैं मुझे के जीवन के लिए एक नहीं मिल सकता है! –

उत्तर

12

I am just curious: how is val 2 = 123 understood by Scala?

आप के रूप val 2 = 123 के बारे में सोच सकते हैं:

:

123 match { 
    case 2 => 2 
} 

स्काला में चर नाम हिस्सा हमेशा एक साधारण नाम नहीं है, यह भी एक पैटर्न, उदाहरण के लिए हो सकता है

val (x, y) = (1, 2) 

क्रमश: 1 और 2 से x और y को विघटित कर देगा। स्कैला में, मामले कथन के बाद वैल के बाद भी अनुमति दी गई है और इसे पैटर्न पैटर्न में अनुवादित किया गया है।

From the specification (जोर मेरा):

Value definitions can alternatively have a pattern as left-hand side. If p is some pattern other than a simple name or a name followed by a colon and a type, then the value definition val p = e is expanded as follows:

(प्रासंगिक उदाहरण पर जा रहा है):

If p has a unique bound variable x:

val x = e match { case p => x } 

यही कारण संकलक एक संकलन समय त्रुटि उत्सर्जन नहीं है। इस google group question में इस विषय की लंबी चर्चा है।

+0

मुझे लगता है कि यह मिलान दूसरे तरीके से होना चाहिए क्योंकि '2' मिलान किया गया पैटर्न है। –

+0

आप दोनों को धन्यवाद! यह भी दिखाता है कि क्यों 'वैल 2 = 2' समस्याओं के बिना काम करता है। हालांकि, क्या कोई * उदाहरण है जिसमें बाएं हाथ की ओर एक सामान्य पैटर्न की बजाय एक शाब्दिक है? –

+0

@ क्यूबिकलेटटस ऐसा कारण नहीं सोच सकता है जिसे आप वास्तव में * करना चाहते हैं। –

3

val घोषणा का बायां हाथ एक पैटर्न हो सकता है। scala language documentation देखें।

तो

val 2 = 123 

रूप

123 match { 
    case 2 => 2 
} 

जो एक मैच त्रुटि देता लिखा जा सकता है।

वास्तविक जीवन में यह ज्यादातर tuples को readably स्थानीय Vals निकालने के लिए प्रयोग किया जाता है:

val test = ("Foo", 30) 
val (name, age) = test 
संबंधित मुद्दे

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