2010-10-25 14 views
7

मैं इस चेतावनी का लाभ उठाना चाहता हूं कि मिलान मिलान होने पर स्कैला के मुद्दे ("पूर्ण नहीं है) - ताकि मैं एक को भूल न सकूं (मेरे पास दर्जनों हैं)। निम्नलिखित सरलीकृत उदाहरण मेरा प्रयास दिखाता है:स्कैला पैटर्न मिलान कह रहा है "मैच संपूर्ण नहीं है!"

sealed case class MESSAGE() 
class SUCCESS_MESSAGE extends MESSAGE 
class FAILURE_MESSAGE extends MESSAGE 

def log(str: String, msgType: MESSAGE) { 
    msgType match { 
     case t:SUCCESS_MESSAGE => println("FAILURE: " + str) 
     case t:FAILURE_MESSAGE => println("SUCCESS: " + str) 
    } 
} 

समस्या यह है कि यह कहता है कि "मैच पूर्ण नहीं है!" हालांकि सभी संभावित संयोजन सूचीबद्ध हैं। मैं डाल चाहते हैं तो "मामले _ =>" वहाँ में, चेतावनी के पूरे मुद्दे मेरे लिए अवैध है क्योंकि मैं

class INFO_MESSAGE extends MESSAGE 

जोड़ सकता है और कोई चेतावनी जारी की जाएगी।

क्या कोई समाधान है?

+6

SUCCESS_MESSAGE प्रिंट चाहिए "विफलता:", तुम काफी यकीन कर रहे हैं? –

+2

मैं किसी भी परिस्थिति में केस क्लास को विस्तारित करने की अत्यधिक अनुशंसा करता हूं। सिर्फ आपकी जानकारी के लिए। – jsuereth

उत्तर

32

आदर्श रूप से, आपको एक ठोस वर्ग नहीं बढ़ाया जाना चाहिए, और विशेष रूप से केस क्लास नहीं!

यह देखते हुए कि SUCCESS_MESSAGE और FAILURE_MESSAGE को अनुकूलित करने की कोई संभावना नहीं है, तो आप शायद इन सिंगलेट्स को भी बनाना चाहते हैं।

अंत में, अंडरकोर्स स्कैला चर या कक्षा के नामों में एक खराब चीज (टीएम) हैं। सभी अपरकेस नाम या तो बेवकूफ नहीं हैं। तो:

sealed trait Message 
case object SuccessMessage extends Message 
case object FailureMessage extends Message 

def log(str: String, msgType: Message) = msgType match { 
    case SuccessMessage => println("Success: " + str) 
    case FailureMessage => println("Failure: " + str) 
} 

वैकल्पिक रूप से, और मैं होगा इस सलाह देते हैं, आप वास्तविक संदेश स्ट्रिंग लपेट कर सकते हैं:

sealed trait Message { def msg: String } 
case class Success(msg:String) extends Message 
case class Failure(msg:String) extends Message 

def log(msg: Message) = msg match { 
    case Success(str) => println("Success: " + str) 
    case Failure(str) => println("Failure: " + str) 
} 
+0

एस/स्केल वैरिएबल नामों में/स्कैला क्लास नामों में/ –

+0

वैरिएबल या क्लास नाम, यदि आप सटीक होना चाहते हैं :) –

+2

पहला उदाहरण अभी भी एक ही समस्या का सामना कर रहा है, क्योंकि 'संदेश' को' सार 'चिह्नित नहीं किया गया है। दूसरा उदाहरण ठीक है क्योंकि अमूर्त विधि 'msg' गारंटी देता है कि' संदेश' सार भी है। –

27

आप एक मामले को याद किया: संदेश MESSAGE का उदाहरण हो सकता है, इसके उप-वर्गों में से एक नहीं।

यदि आप इस मामले को असंभव बनाना चाहते हैं, तो आपको MESSAGE अमूर्त बनाना होगा। इससे चेतावनी दूर हो जाएगी।

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