2010-04-16 9 views
8

नमस्ते साथी स्काला प्रोग्रामर्सस्काला java.lang.String और मामला कक्षा

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

case class PersonClass(name: String, age: Int) 

object CaseTester { 
def main(args:Array[String]) 
{ 
    val string = "hej" 
    string match { 
    case e:String => println(string) 
    case PersonClass => println(string) 
    } 
} 
} 

जब मैं इस तरह कर रहा हूँ मैं त्रुटि:

pattern type is incompatible with expected type; 
found : object PersonClass 
required: java.lang.String 
case PersonClass => println(string) 

और अगर मैं उसके बाद निम्न करने के लिए मिलान पैटर्न में दूसरी पंक्ति बदलने के लिए:

case e:PersonClass => println(string) 

मैं तो मिल त्रुटि:

error: scrutinee is incompatible with pattern type; 
found : PersonClass 
required: java.lang.String 
case e:PersonClass => println(string) 

हालांकि अगर मैं स्ट्रिंग परिभाषा को निम्नलिखित में बदलता हूं तो यह दोनों मामलों में ठीक से संकलित करता है।

val string:AnyRef = "hej" 
+0

मूल रूप से मैं इस समस्या, एक मामले वर्ग जो भी एक निकालने होने के लिए सक्षम होना चाहिए बनाने का प्रयास करते हुए लेकिन जब मुझे लगता है कि नहीं करता है के बारे में यह भावना का एक बहुत :) – Stefan

+0

आप एक वर्ग से मेल नहीं कर सकते हैं मुलाकात उसके जैसा। 'केस PersonClass =>' केवल तभी काम करता है जब 'PersonClass' एक ऑब्जेक्ट है। कक्षाओं से मेल खाने के लिए, आप या तो स्थानीय चर को असाइन करते हैं: 'केस ई: स्ट्रिंग =>' या अनपॅक अगर यह टुपल या केस क्लास है: '(3, 4) मैच {केस (ए, बी) =>' – Ryan

उत्तर

21

अनुमानित प्रकार की स्ट्रिंग स्ट्रिंग है। यह वैल की घोषणा के बाद जाना जाता है।

जैसा कि हम पहले से ही पैटर्न मिलान के दौरान इसे जानते हैं, यह उन पैटर्न से मेल नहीं खाता है जो स्ट्रिंग्स (जैसे आपकी व्यक्तिगत क्लास) नहीं हैं, क्योंकि वे कभी मेल नहीं खाएंगे। यही है कि "पैटर्न प्रकार अपेक्षित प्रकार के साथ असंगत है; पाया गया: ऑब्जेक्ट पर्सनल क्लास आवश्यक: java.lang.String केस PersonClass => println (string)" त्रुटि का अर्थ है: हम एक पैटर्न की अपेक्षा करते हैं जो स्ट्रिंग का उप-वर्ग है, लेकिन कुछ मिला (PersonClass) जो नहीं है।

जब आप किसी भी प्रकार की स्थिति को बल देते हैं तो स्थिति बदल जाती है। कंपाइलर स्ट्रिंग को एनीफ के रूप में मानेंगे, इसलिए एनीआरएफ का विस्तार करने वाले पैटर्न मिल सकते हैं। PersonClass AnyRef है, इसलिए आपको त्रुटि नहीं मिलती है।

8

यदि आपके पास पहले से स्ट्रिंग प्रकार का ऑब्जेक्ट है तो यह कभी भी एक प्रकार का व्यक्ति क्लास से मेल नहीं खाएगा। यह वास्तव में एक विशेषता है कि संकलक आपको इन मैचों को नहीं करने देता है जो कभी सफल नहीं होंगे।

किसी भी प्रकार के साथ आप बस प्रकार को बंद कर रहे हैं। यह इस परिभाषा से मेल नहीं खाएगा लेकिन संकलक इस समस्या को नहीं पकड़ सकता है।

5

मुझे लगता है कि आप कुछ और परीक्षण करने की कोशिश कर रहे हैं, लेकिन संकलक आपको देने के लिए बहुत स्मार्ट है।

शायद तुम कुछ इस तरह हैं:,

object Test { 
    case class Person(name: String, age: Int) { } 
    def myPrint(ar: AnyRef) { 
    ar match { 
     case s: String => println(s) 
     case Person(name, age) => println("My name is "+name) 
     case _ => println("I am a mystery!") 
    } 
    } 
    def test = { 
    myPrint("Hello, World") 
    myPrint(Person("John Doe",40)) 
    myPrint(5) 
    } 
} 

लेकिन जैसा कि अन्य लोगों ने बताया है यदि आप अन्य प्रकार के लिए जाँच करने के लिए वास्तव में जरूरत नहीं है, संकलक शिकायत है कि तुम क्या कर रहे हैं कि कर व्यर्थ है। एक अच्छी बात भी: यदि आप एक परीक्षा नहीं लिख रहे थे, तो आपके पास हार्ड-टू-डीबग रनटाइम त्रुटि हो सकती है।

0
object ws { 

case class PersonClass(name:String,age: Int) 
val p=new PersonClass("ach",25)      

    def string(x: Any) = x match { 
    case x:String => println(x) 
    case x:PersonClass => println(p.name +" "+p.age) 
    }            

    string("aa")         //> aa 
    string(p)         //> ach 25 

}