2009-04-11 16 views
10

स्काला में यह एक Seq [चार] के रूप में यह इलाज एक स्ट्रिंग की invididual पात्रों पर आधारित पैटर्न तैयार संभव है मिलान पैटर्न।रूप Seq [चार] एक स्ट्रिंग

इस सुविधा का एक उदाहरण A Tour of Scala

में बताया गया है यह वहाँ इस्तेमाल किया उदाहरण कोड है:

object RegExpTest1 extends Application { 
def containsScala(x: String): Boolean = { 
    val z: Seq[Char] = x 
    z match { 
     case Seq('s','c','a','l','a', rest @ _*) => 
       println("rest is "+rest) 
       true 
     case Seq(_*) => 
       false 
    } 
} 

}

समस्या मैं इस के साथ है टुकड़ा की तीसरी पंक्ति है :

val z: Seq[Char] = x 

इस प्रकार का कलाकार क्यों आवश्यक है? क्या किसी स्ट्रिंग को सभी परिस्थितियों में एक सेक [चर] की तरह व्यवहार नहीं करना चाहिए (जिसमें पैटर्न मिलान शामिल होगा)? हालांकि, इस रूपांतरण के बिना, कोड स्निपेट काम नहीं करेगा।

उत्तर

11

यह सही नहीं है, तो 100% सुनिश्चित नहीं है, लेकिन मेरा अंतर्ज्ञान कहता है कि इस स्पष्ट कलाकार के बिना आप java.lang.String के खिलाफ पैटर्न मिलान करेंगे, जो आप नहीं चाहते हैं।

स्पष्ट डाली स्काला संकलक Predef.stringWrapper अंतर्निहित रूपांतरण का उपयोग करने के लिए मजबूर करता; इस प्रकार, RichStringSeq[Char] तक फैला है, तो आप पैटर्न पैटर्न करने में सक्षम हैं जैसे स्ट्रिंग वर्णों का अनुक्रम था।

+0

भावना का एक बहुत बनाता है और मूल रूप से मैं क्या अनुमान लगा दिया गया था है। हालांकि, मुझे निहित कनवर्टर नहीं मिला। इस पर ध्यान दिलाने के लिए धन्यवाद। तो मूल रूप से, यह जावा इंटरऑपरेबिलिटी के लिए एक बड़ी छूट है, कुछ प्रकार की ध्वनि को त्याग देता है। –

+2

कोई भी प्रकार की ध्वनि खो जाती है।लागू रूपांतरण केवल एक फ़ंक्शन कॉल डालने वाला कंपाइलर है, कुछ वैल जेड: सेक [चर] = स्ट्रिंग 2 सेक (x) –

7

मैं सब कुछ एंड्री कहा कि प्रतिध्वनित करने के लिए जा रहा हूँ। इंटरऑपरेबिलिटी के लिए, स्कैला तार java.lang.String एस हैं। Predef में, वहाँ एक अंतर्निहित रूपांतरण String से RichString है, जो Seq[Char] लागू करता है।

एक पैटर्न मैच कोडिंग, एक मध्यवर्ती वैल z की आवश्यकता होगी, धारण करने के लिए बिना की शायद अच्छे तरह से Seq[Char]:

def containsScala(x: String): Boolean = { 
    (x: Seq[Char]) match { 
    ... 
    } 
} 
17

प्रश्न और टिप्पणियों में चल रहा शब्दावली के कुछ वास्तविक दुरुपयोग नहीं है। इस कोड में कोई कलाकार नहीं है, और विशेष रूप से "तो मूल रूप से, यह जावा इंटरऑपरेबिलिटी के लिए एक बड़ी रियायत है, कुछ प्रकार की सशक्तता का त्याग" वास्तविकता में कोई आधार नहीं है।

एक स्केला डाली इस तरह दिखता है: x.asInstanceOf[Y]
क्या आपने ऊपर देखा, एक काम है: क्योंकि String से Seq[Char] को एक अंतर्निहित रूपांतरण है वहाँ val z: Seq[Char] = x

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

प्रकारों के बीच निहित रूपांतरणों और मूल प्रश्न के उत्तर के आधार पर समस्या यह है कि निहित रूपांतरण केवल तब होता है जब मूल मान चेक टाइप नहीं करता है। चूंकि स्ट्रिंग पर मिलान करना पूरी तरह से कानूनी है, इसलिए कोई रूपांतरण नहीं होता है, मैच बस विफल रहता है।

+1

रियायत यह है कि स्ट्रिंग सीधे सेक [चर] से प्राप्त नहीं हो सकती है क्योंकि यह जावा प्रकार के लिए टाइप टाइप है। –

+2

क्षमा करें, आप सही हैं कि एक रियायत है (वास्तव में स्कैला उनके साथ तैर रही है) सिर्फ इतना नहीं कि प्रकार की ध्वनि की कोई हानि है, जिसका मतलब कुछ विशिष्ट है और यहां प्रभावित नहीं होता है। – extempore

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