2012-09-29 27 views
6

मैं स्कैला की प्रकटताओं की अवधारणा सीख रहा हूं और मुझे बुनियादी समझ है कि कुछ सरल मामलों में इसका उपयोग कैसे किया जाए। OptNanifest और NoManifest के लिए मुझे क्या पहेली है? मैंने तब कभी नहीं देखा है। क्या कोई ऐसा उदाहरण दे सकता है जहां उनकी ज़रूरत है/उपयोगी?स्कैला के ऑप्टमैनिफेस्ट और नोमैनिफेस्ट के लिए क्या है?

(मुझे लगता है कि स्काला 2.10 TypeTags साथ Manifest रों की अवधारणा को बदल देता है, लेकिन जब तक 2.10 अंतिम है हम Manifest रों उपयोग करना होगा।)

उत्तर

6

मान लीजिए हम निम्नलिखित मामले वर्ग और प्रकार उर्फ ​​है:

scala> case class Foo[A](a: A) 
defined class Foo 

scala> type F = Foo[_] 
defined type alias F 

हम कर सकते हैं अब (बहुत उपयोगी नहीं) प्रकार F की चीजों की एक सूची बनाने:

scala> val foos: List[F] = List(Foo(1), Foo("a"), Foo('a)) 
foos: List[F] = List(Foo(1), Foo(a), Foo('a)) 

और हम एक सरणी में इस बारी कर सकते हैं:

scala> foos.toArray 
res0: Array[F] = Array(Foo(1), Foo(a), Foo('a)) 

तो स्पष्ट रूप से संकलक प्रकट यह List पर toArray विधि के लिए एक अंतर्निहित तर्क के रूप में की जरूरत है खोजने के लिए सक्षम है।

scala> manifest[F] 
<console>:11: error: overloaded method value classType with alternatives: 
    (prefix: scala.reflect.Manifest[_],clazz: Class[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[F],arg1: scala.reflect.Manifest[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[_])scala.reflect.Manifest[F] 
cannot be applied to (java.lang.Class[Foo[_$1]], scala.reflect.Manifest[_$1]) 
       manifest[F] 

तो यह स्पष्ट है कि संकलक प्रकट होता है का उपयोग कर हमारे प्रकार उर्फ ​​में वाइल्डकार्ड का प्रतिनिधित्व करने में परेशानी हो रही है: लेकिन अगर हम एक सादे पुराने ManifestF के लिए के लिए पूछना है, हम कोई त्रुटि मिलती है।

कारण toArray काम करता है कि यह की अपेक्षा करता है, न केवल Manifest। और वास्तव में हम F के लिए कोई समस्या नहीं है, ठीक है क्योंकि ClassManifestOptManifest का उपयोग अपने प्रकार के तर्कों का प्रतिनिधित्व करने के लिए करता है-Manifest के विपरीत, जिसका प्रकार तर्क Manifest प्रकार की अन्य चीजें हैं।

scala> classManifest[F] 
res2: ClassManifest[F] = Foo[<?>] 

<?>NoManifest की स्ट्रिंग प्रतिनिधित्व है यही कारण है कि। यह None की भूमिका निभाता है, जिससे संकलक F (जो कि हमें सरणी बनाने के लिए जरूरी है) के बारे में वर्ग की जानकारी का प्रतिनिधित्व करने की इजाजत देता है, F के प्रकार के तर्कों के बारे में कुछ भी बगैर "नो, मैं कर सकता हूं" टी मॉडल कि "।