प्रोग्रामेटिक रूप से यह निर्धारित करने के लिए कि क्या दिया गया वर्ग केस क्लास या साधारण श्रेणी है?प्रोग्रामेटिक रूप से यह निर्धारित करने के लिए कि कक्षा एक केस क्लास या साधारण वर्ग है या नहीं?
उत्तर
वर्तमान में (2011), आप वर्ग इंटरफ़ेस scala.Product
लागू करता है यदि पता लगाने के लिए प्रतिबिंब का उपयोग कर सकते हैं:
scala> def isCaseClass(o: AnyRef) = o.getClass.getInterfaces.find(_ == classOf[scala.Product]) != None
isCaseClass: (o: AnyRef)Boolean
scala> isCaseClass(Some(1))
res3: Boolean = true
scala> isCaseClass("")
res4: Boolean = false
यह सिर्फ एक सन्निकटन है - आप आगे जाकर जांचें कि क्या इसका copy
विधि है सकता है, यदि यह Serializable
लागू करता है, यदि उसके पास उचित apply
या unapply
विधि के साथ एक साथी ऑब्जेक्ट है - संक्षेप में, प्रतिबिंब का उपयोग करके केस क्लास से अपेक्षित सभी चीजों की जांच करें।
अगले रिलीज में से किसी एक में आने वाले स्कैला प्रतिबिंब पैकेज को केस क्लास का पता लगाना आसान और अधिक सटीक बनाना चाहिए।
संपादित करें:
अब आप यह नया स्काला प्रतिबिंब लाइब्रेरी का उपयोग कर सकते हैं - अन्य उत्तर देखें।
यदि आपका मतलब है: क्या मैं निर्धारित कर सकता हूं कि कक्षा एक केस क्लास या गैर-केस क्लास प्रोग्रामेटिक रूप से है, तो जवाब नहीं है, लेकिन आप अनुमान लगा सकते हैं। केस क्लासेस सिर्फ एक कंपाइलर हैक हैं, वे कुछ तरीकों को बनाने के लिए कंपाइलर को बताते हैं। अंतिम बाइटकोड में, सामान्य कक्षाओं और केस क्लास के बीच कोई अंतर नहीं है।
से How does a case class differ from a normal class?
- ,
- आप पैटर्न उस पर मिलान कर सकते हैं आप नए कीवर्ड का उपयोग किए बिना इन कक्षाओं के उदाहरण का निर्माण कर सकते,
- सभी निर्माता तर्क के बाहर का उपयोग करने से जाया जा सकता है स्वचालित रूप से जेनरेट किए गए एक्सेसर फ़ंक्शंस,
- टूस्ट्रिंग विधि स्वचालित रूप सेनाम मुद्रित करने के लिए फिर से परिभाषित की जाती है केस क्लास केऔर उसके सभी तर्क,
- बराबर विधि स्वचालित रूप से दो तुलनात्मक रूप से पहचान के बजाय समान केस वर्ग के उदाहरणों की तुलना करने के लिए फिर से परिभाषित की जाती है।
- हैशकोड विधि कन्स्ट्रक्टर तर्कों के हैशकोड का उपयोग करने के लिए स्वचालित रूप से फिर से परिभाषित की जाती है।
तो तुम वास्तव में सिर्फ सही तरीकों & साथी खुद वस्तुओं को परिभाषित करते हुए एक मामला वर्ग बना सकते हैं।
एक विचार के लिए कि कैसे एक वर्ग एक केस क्लास हो सकता है, axel22 से उत्तर देखें।
नई स्काला प्रतिबिंब एपीआई का उपयोग करना:
scala> class B(v: Int)
defined class B
scala> case class A(v: Int)
defined class A
scala> def isCaseClassOrWhat_?(v: Any): Boolean = {
| import reflect.runtime.universe._
| val typeMirror = runtimeMirror(v.getClass.getClassLoader)
| val instanceMirror = typeMirror.reflect(v)
| val symbol = instanceMirror.symbol
| symbol.isCaseClass
| }
isCaseClassOrWhat_$qmark: (v: Any)Boolean
scala> class CaseClassWannabe extends Product with Serializable {
| def canEqual(that: Any): Boolean = ???
| def productArity: Int = ???
| def productElement(n: Int): Any = ???
| }
defined class CaseClassWannabe
scala> isCaseClassOrWhat_?("abc")
res0: Boolean = false
scala> isCaseClassOrWhat_?(1)
res1: Boolean = false
scala> isCaseClassOrWhat_?(new B(123))
res2: Boolean = false
scala> isCaseClassOrWhat_?(A(321))
res3: Boolean = true
scala> isCaseClassOrWhat_?(new CaseClassWannabe)
res4: Boolean = false
- 1. यह निर्धारित करने के लिए कि कोई वर्ग अन्य वर्ग का उप-वर्ग है या नहीं?
- 2. यह निर्धारित करना कि एक एंड्रॉइड डिवाइस प्रोग्रामेटिक रूप से रूट है या नहीं?
- 3. क्या यह निर्धारित करने के लिए एक ह्युरिस्टिक है कि कोई विधि या फ़ील्ड कक्षा में है या नहीं?
- 4. यह निर्धारित करने के लिए कि SQL सर्वर का कोई उदाहरण केस संवेदनशील है या नहीं
- 5. यह निर्धारित करने के लिए कि कोई कुंजी एक अक्षर या संख्या है या नहीं?
- 6. यह निर्धारित करने के लिए प्रतिबिंब का उपयोग कैसे करें कि कक्षा आंतरिक है या नहीं?
- 7. यह निर्धारित करने के लिए कि टी सामान्य में एक मान प्रकार या संदर्भ वर्ग है या नहीं?
- 8. यह निर्धारित करने के लिए कि कोई भाषा रिकर्सिव या रिकर्सिव रूप से गणना योग्य है या नहीं?
- 9. यह निर्धारित करने के लिए कि कोई सिस्टम। डायग्नोस्टिक्स.प्रोसेस 32 या 64 बिट है या नहीं?
- 10. यह जांचने के लिए कि iCloud प्रोग्रामेटिक रूप से कॉन्फ़िगर किया गया है या नहीं,
- 11. Win32 API यह निर्धारित करने के लिए कि कोई पथ सापेक्ष या पूर्ण है या नहीं?
- 12. यह निर्धारित करने के लिए कि कोई ऐप मूल या HTML5 है या नहीं?
- 13. यह निर्धारित करने के लिए कि कोई नेटवर्क पथ उपलब्ध है या नहीं (ऑनलाइन या ऑफ़लाइन)?
- 14. यह निर्धारित करने के लिए एक अच्छा एल्गोरिदम क्या है कि कोई इनपुट एक पूर्ण वर्ग है या नहीं?
- 15. प्रोग्रामेटिक रूप से यह निर्धारित करने के लिए कि कोई आरएसएस फ़ीड एक पूर्ण फ़ीड या आंशिक फ़ीड
- 16. यह निर्धारित करने के लिए कि कोई तिथि यूएस या अंतरराष्ट्रीय अवकाश है या नहीं, यह निर्धारित करने के लिए सर्वश्रेष्ठ निःशुल्क लाइब्रेरी या डेटाबेस?
- 17. यह निर्धारित करें कि लेनदेन डीटीसी लेनदेन है या नहीं,
- 18. यह निर्धारित करने के लिए कि यह जावास्क्रिप्ट या jquery में दिन या रात है या नहीं?
- 19. यह निर्धारित करने के लिए कि एक्सएमएल अच्छी तरह से बनाया गया है या नहीं?
- 20. यह निर्धारित करने के लिए कि यूआरएल एक छवि है या नहीं?
- 21. यह निर्धारित करने के लिए कि कोड स्क्रिप्ट या फ़ंक्शन के रूप में निष्पादित कर रहा है या नहीं?
- 22. यह निर्धारित करने के लिए कि जावा में वर्ण एक अक्षर है या नहीं?
- 23. एंड्रॉइड: यह निर्धारित करने के लिए कि एक स्पर्श घटना सर्कल में है या नहीं?
- 24. यह निर्धारित करने के लिए कि जावास्क्रिप्ट ऑब्जेक्ट एक ईवेंट है या नहीं?
- 25. यह निर्धारित करने के लिए कि XElement.Elements() में एक विशिष्ट नाम वाला नोड है या नहीं?
- 26. यह निर्धारित करने के लिए कि टाइप एक संरचना है या नहीं?
- 27. यह निर्धारित करने के लिए कि कोई ऑब्जेक्ट जावास्क्रिप्ट में एक वस्तु शब्दशः है या नहीं?
- 28. यह निर्धारित करने के लिए कि कोई .NET प्रकार कस्टम संरचना है या नहीं?
- 29. यह निर्धारित करने के लिए कि क्या .NET अपवाद संभाला जा रहा है या नहीं?
- 30. यह निर्धारित करने के लिए कि कोई पथ निर्देशिका के अंदर है या नहीं? (POSIX)
धन्यवाद, axel22। यह मेरी समस्या का समाधान है। मुझे उम्मीद है कि डेवलपर्स जल्द से जल्द स्कैला की इस विधि को जोड़ देंगे। Сlass इंटरफेस scala लागू करता है। उत्पाद - यह इसके लिए एक पर्याप्त शर्त है? – DimParf
नहीं, यह जांचने के लिए कोई पर्याप्त शर्त नहीं है (afaik)।आप मूल कोड में 'केस' संशोधक के अस्तित्व की जांच नहीं कर सकते हैं, केवल 'केस' संशोधक के कारण उत्पन्न होने वाली विधियों के लिए। जैसा कि मैंने उपरोक्त लिखा है, पूरी बात सिर्फ एक अनुमान है। – axel22