2010-11-30 9 views
6

मैं पैरामीटर नामों और उनके मूल्यों को संग्रहीत करने के लिए हैशैप बनाना चाहता हूं। पैरामीटर हालांकि विभिन्न प्रकार के हैं। मैं हैश मैप [स्ट्रिंग, कोई भी] का उपयोग कर सकता था, लेकिन मुझे नहीं पता कि वे किस प्रकार के बाद में हैं। क्या वैसे भी मैं प्रकार की जानकारी पुनर्प्राप्त कर सकता हूं? या जोड़ी को स्टोर करने का कोई बेहतर तरीका है?स्कैला प्रतिबिंब

+0

संभावित डुप्लिकेट [मैं स्कैला पर चारों ओर मिरर कैसे प्राप्त करूं? या, मुझे अपने संग्रह का प्रकार पैरामीटर क्यों नहीं मिल सकता है?] (Http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or- क्यों -cant-i-get-the-type-पैरामीटर) –

+0

क्या इनमें से कोई भी उत्तर उपयोगी आपके लिए उपयोगी था? यदि नहीं, तो क्या आपके पास कोई प्रतिक्रिया है जो आपकी आवश्यकताओं को बेहतर तरीके से लक्षित करने में हमारी सहायता करेगी? –

+0

अच्छी तरह से, उनमें से कोई भी वास्तव में मेरी समस्या हल नहीं किया। मुझे कुछ लोगों ने बताया (ऑफ़लाइन) कोई सुरुचिपूर्ण समाधान नहीं है। मैंने इस तरह की समस्या से बचने के लिए बाद में अपना डिजाइन बदल दिया ... – user398384

उत्तर

5

क्या आप स्थिर प्रकार की जानकारी, या गतिशील प्रकार की जानकारी तक पहुंच चाहते हैं? यदि आप पूर्व के बाद हैं, तो आप टाइप की गई कुंजी का उपयोग कर सकते हैं। इन पंक्तियों के साथ कुछ काम करना चाहिए:

final class Key[T] 

object Registry { 
    private var backingMap: Map[Key[_], _] = Map.empty 

    def put[T](k: Key[T], v: T) = backingMap += (k -> v) 

    def get[T](k: Key[T]): Option[T] = backingMap get k map (_.asInstanceOf[T]) 
} 

scala> val strKey = new Key[String] 
strKey: Key[String] = [email protected] 

scala> val intKey = new Key[Int] 
intKey: Key[Int] = [email protected] 

scala> Registry.put(strKey, "asdf") 

scala> Registry.get(strKey) 
res0: Option[String] = Some(asdf) 

scala> Registry.put(intKey, "asdf") 
<console>:10: error: type mismatch; 
found : Key[Int] 
required: Key[Any] 
     Registry.put(intKey, "asdf") 

वैकल्पिक रूप से, आप untyped कुंजियों का उपयोग करें और मानचित्र में प्रकार की जानकारी प्रकट होता है का उपयोग कर स्टोर (Daniel suggested के रूप में) कर सकते हैं:

class Registry[K] { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[K,(Manifest[_], Any)] 

    def put[T](key: K, item: T)(implicit m: Manifest[T]) { 
     _map += (key -> (m, item)) 
    } 

    def get[T](key:K)(implicit m : Manifest[T]): Option[T] = { 
     for ((om, v) <- _map get key if om <:< m) 
     yield v.asInstanceOf[T] 
    } 
} 

बाद दृष्टिकोण लाभ दिया है कि आप किसी कुंजी के रूप में कुछ भी उपयोग कर सकते हैं, और आपको मूल टाइप की गई मुख्य ऑब्जेक्ट्स को पास करने की आवश्यकता नहीं है। हालांकि, इसमें कमी है कि जब आप get विधि को कॉल करते हैं तो आपको मान प्रकार निर्दिष्ट करना होगा। यदि आप गलत प्रकार निर्दिष्ट करते हैं तो आपको None मिल जाएगा जैसे कि कुंजी रजिस्ट्री में बिल्कुल नहीं है, जबकि टाइप की गई कुंजी के साथ आपको किसी कुंजी से जुड़े किसी भी मूल्य को प्राप्त करने की गारंटी है।

1

यदि आपके पास बहुत अधिक मूल्य नहीं हैं, तो आप HList जोड़े या इसी तरह की संरचनाओं का उपयोग करने पर विचार कर सकते हैं।

3

this देखें, जो आप जो पूछते हैं उसे लागू करता है।

+0

अच्छा! मैंने आपके उत्तर में कुछ हद तक आपके कार्यान्वयन को सरल बना दिया और टाइप किए गए मुख्य दृष्टिकोण और संग्रहीत अभिव्यक्ति दृष्टिकोण के बीच अंतर को समझाने का प्रयास किया। –