2011-02-15 14 views
16

मैंने अपने isInstance को एक मैच के साथ जांचने की कोशिश की, लेकिन यह काम नहीं करता है।स्कैला मैच त्रुटि

मेरी विधि में मैं एक पेड़ नोड के लिए एक जांच करता हूं - यदि यह एक पत्ता है - मैं इसे एक वेक्टर के अंदर तुरंत वापस करना चाहता हूं, यदि नहीं - तो मैं विधि के साथ जारी रहता हूं।

तो मूल रूप से मैं था:

//code here 
    if (common.isInstanceOf[LeafNode]) { 
     return Vector(common.asInstanceOf[LeafNode].data) 
    } 
    //code here 

तो मैं के साथ बदलने की कोशिश की:

//code here 
    common match { 
     case leaf: LeafNode => return Vector(leaf.data) 
    } 
    //code here 

लेकिन मैं scala.MatchError मिलता है।

उत्तर

21

आपको MatchError मिल रहा है, जहां commonLeafNode नहीं है। आपका if और match अभिव्यक्ति समकक्ष नहीं हैं। मुझे लगता है कि उन्हें बराबर बनाने के लिए सबसे सीधा रास्ता है:

common match { 
    case leaf: LeafNode => return Vector(leaf.data) 
    case _ => 
} 

लेकिन मैं पूरे कोड ब्लॉक देखने की सलाह देते हैं और बाहर काम कर रहे इस काम करने के लिए अधिक कार्यात्मक तरीका है। वह है, बीच में return के बिना। याद रखें कि मैच, एक अभिव्यक्ति है ताकि कुछ इस तरह संभव हो सकता है:

def foo = { 
    //code here 
    common match { 
    case leaf: LeafNode => Vector(leaf.data) 
    case notLeaf: Branch => //code here 
    } 
} 
+0

के पहले संस्करणों के बारे में निश्चित नहीं है धन्यवाद, मैं इसे पुन: कार्य करने का प्रयास करूंगा – drozzy

+1

आपने वापसी का उपयोग क्यों किया? – raam86

5

समस्या यह है कि आपके match ब्लॉक में मामलों का सेट संपूर्ण नहीं है; यदि common कुछ भी LeafNode है, तो MatchError फेंक दिया जाएगा। तुम इतनी तरह एक कैच-ऑल मामले होने से इस का समाधान कर सकते हैं:

common match { 
    case leaf: LeafNode => return Vector(leaf.data) 
    ... // other cases 
    case other => ... // what to do if nothing else matches 
} 

यह एक जावा स्विच बयान में default मामले के अनुरूप है। other केस को "अचूक पैटर्न" कहा जाता है क्योंकि इसमें कोई विशेषताएं नहीं है; इसे किसी विशेष प्रकार या कन्स्ट्रक्टर की आवश्यकता नहीं होती है, इसलिए यह हमेशा उस चीज़ से मेल खाती है जो इसके माध्यम से होती है। चर का नाम other होना आवश्यक नहीं है, यह कुछ भी हो सकता है, या यहां तक ​​कि _ ... वास्तव में आपको यहां एक नया चर जोड़ने की आवश्यकता नहीं है क्योंकि यह common के समान होगा।

शैली के बिंदु पर, यह match ब्लॉक के अंदर वापसी विवरण देने के लिए आम तौर पर खराब रूप है; संपूर्ण ब्लॉक एक अभिव्यक्ति है जो इसके मामलों में से एक का मूल्यांकन करता है, इसलिए बस पूरी अभिव्यक्ति को वापस कर दें। साथ ही, आपको return कीवर्ड का उपयोग करने की आवश्यकता नहीं है, क्योंकि फ़ंक्शन परिभाषा में अंतिम अभिव्यक्ति परिणाम के रूप में उपयोग की जाएगी।

+0

रिटर्न के बारे में अच्छी बात है, धन्यवाद वास्तव में – drozzy

+0

, अगर आप अपने कार्य में वापसी कथन, स्केला 2.9 संकलक बलों आप की क्या ज़रूरत है फ़ंक्शन के रिटर्न प्रकार को स्पष्ट रूप से बताएं। – Aaron

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