2011-09-14 12 views
11

में पूरी तरह से योग्य classnames साथ पैटर्न मैच समस्या जब यह एक पूरी तरह से योग्य वर्ग के नाम के साथ पैरामिट्रीकृत है मैं स्काला में एक वस्तु मिलान पैटर्न में एक छोटे से समस्या है। यह स्कैला 2.9.0.1 पर आधारित है। कोई भी जानता है कि इस कोड के साथ क्या गलत है?स्काला: parameterization

scala> "foo" match { 
| case y : Seq[Integer] => 
| case y : Seq[java.lang.Integer] => 
<console>:3: error: ']' expected but '.' found. 
    case y : Seq[java.lang.Integer] => 

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

उत्तर

12

Scala Language Specification से, खंड 8.1 पैटर्न दिखाई देता है तो सक्षम हो सकता है के बाद: क्या, एक प्रकार पैटर्न के रूप में जाना जाता है धारा 8.2 में परिभाषित करने की जरूरत है:

Type patterns consist of types, type variables, and wildcards. A type pattern T is of one of the following forms:

...

A parameterized type pattern T [a(1), . . . , a(n)], where the a(i) are type variable patterns or wildcards _. This type pattern matches all values which match T for some arbitrary instantiation of the type variables and wildcards. The bounds or alias type of these type variable are determined as described in (§8.3).

...

A type variable pattern is a simple identifier which starts with a lower case letter. However, the predefined primitive type aliases unit, boolean, byte, short, char, int, long, float, and double are not classified as type variable patterns.

तो, वाक्य रचनात्मक रूप से, आप इस स्थिति में एक प्रकार परिवर्तनीय पैटर्न के रूप में पूरी तरह से योग्य वर्ग का उपयोग नहीं कर सकते हैं। हालांकि, आप एक प्रकार के उपनाम का उपयोग कर सकते हैं, इसलिए:

type JavaInt = java.lang.Integer 
List(new java.lang.Integer(5)) match { 
    case y: Seq[JavaInt] => 6 
    case _ => 7 
} 

अपेक्षित 6 लौटाएगा। समस्या यह है कि एलन बर्लिसन बताते हैं कि निम्नलिखित 6:

List("foobar") match { 
    case y: Seq[JavaInt] => 6 
    case _ => 7 
} 

क्योंकि प्रकार मिटाया जा रहा है। आप आरईपीएल, या स्केलैक को अनचेक विकल्प के साथ चलाकर देख सकते हैं।

+0

वाह। मैंने आज इसे मारा और अंततः यह सवाल पाया। मुझे स्केल में "टाइप वैरिएबल पैटर्न" जैसी कोई चीज़ नहीं थी। एसएलएस में अभी भी मुझसे क्या छुपा रहा है ...? –

+2

कुछ ईस्टर अंडे केवल 1/4 और ईस्टर पर सक्रिय होते हैं। –

+0

मैंने https://groups.google.com/d/msg/scala-language/2PNDjkI47Ao/MCQw7RzNUwcJ –

3

वास्तव में अपना पहला उदाहरण या तो काम नहीं करता। - रन-टाइम में वहाँ एक सूची [पूर्णांक के बीच कोई अंतर नहीं है

warning: non variable type-argument Integer in type pattern Seq[Integer] is unchecked since it is eliminated by erasure

तो आप वास्तव में आप क्या करने की कोशिश कर रहे हैं नहीं कर सकते: आप -unchecked साथ आरईपीएल चलाते हैं, तो आपको निम्न त्रुटि देखेंगे ] और एक सूची [कुछ भी], तो आप इस पर पैटर्न-मिलान नहीं कर सकते हैं। आप एक प्रकट साथ पहचानकर्ता ऐसा करने के लिए, http://ofps.oreilly.com/titles/9780596155957/ScalasTypeSystem.html#Manifests और http://www.scala-blogs.org/2008/10/manifests-reified-types.html

+0

मुझे नहीं लगता कि प्रकार विलोपन प्रश्न के बिंदु था। इसके बारे में: '" foo ".asInstanceOf [Any] match {'
'केस x: सेक [इंटीजर] =>'
'केस वाई: सेक [java.lang.Integer] => '
'} ' – Jamil

+0

@ जमील, मेरा मानना ​​है कि 'सेक [java.lang.Integer]' सिर्फ एक वाक्यविन्यास त्रुटि है। मेरा मानना ​​है कि संकलक 'java.lang.Integer' को पहचानकर्ता के रूप में देख रहा है और उनमें उनमें डॉट्स नहीं हो सकते हैं। आप इसे बैकक्वॉट्स में आस-पास 'java.lang.Integer' द्वारा प्रदर्शित कर सकते हैं - फिर यह संकलित हो जाएगा लेकिन आपको अभी भी वही मिटाए जाने की चेतावनी मिल जाएगी जो आप सादे' इंटेगर 'के साथ करते हैं। मैं मानता हूं कि त्रुटि भ्रामक है, लेकिन यह आश्चर्यजनक नहीं है कि आप वास्तव में ऐसा नहीं कर सकते हैं जो @ फ्रैंक वैसे भी करने की कोशिश कर रहा है। –

+0

'java.lang.Integer' एक प्रकार का चर नहीं है। इसके अलावा जब आप कन्स्ट्रक्टर पैटर्न, या टुपल या अनुक्रम इत्यादि का उपयोग करते हैं तो स्कैला बाध्य हो जाता है। अजीब रूप से पर्याप्त है, अगर मैं उपनाम का उपयोग करता हूं 'myint = java.lang.Integer' Scala – Jamil