2013-09-03 11 views
7

क्या नक्शा कुंजी के खिलाफ पैटर्न मिलान को सक्षम करने के लिए कोई स्कैला चाल है? दूसरे शब्दों में, मैं एक एक्स्ट्रेक्टर चाहता हूं कि मैप इंस्टेंस के बगल में भी एक महत्वपूर्ण मान स्वीकार किया जाए जिसका अर्थ यह होगा कि मैं यह पैटर्न केवल तभी मिलान करना चाहता हूं जब मिलान योग्य मान मानचित्र का एक उदाहरण है और दी गई कुंजी के साथ एक प्रविष्टि है इसमें और इस प्रविष्टि के लिए मूल्य रिकर्सिव पैटर्न मिलान के अधीन हो सकता है।स्कैला मानचित्र प्रविष्टियों के खिलाफ पैटर्न मिलान

कुछ इस तरह:

myMap match { 
    case MyMap("a")(a) => // do smth with value a 
    case MyMap("b")(MyMap("c")(c)) => // do smth with value c 
} 

अद्यतन:

मैं किसी तरह से लक्ष्य के करीब दृष्टिकोण मिल गया है, लेकिन यह अभी भी सही है क्योंकि यह सिंथेटिक कुंजी-मान की परिभाषा का तात्पर्य नहीं है -holders:

case class MapKey[K](key: K) { 
    def unapply(o: Any) = o match { 
    case m: Map[K, _] ⇒ m.get(key) 
    case _ ⇒ None 
    } 
} 

val m1 = Map("a" → "aa", "b" → Map("c" → "cc")) 
val m2 = Map("a" → "aa", "d" → "dd") 

val b = MapKey("b") 
val c = MapKey("c") 
val d = MapKey("d") 

for (m ← List(m1, m2)) m match { 
    case b(c(x)) ⇒ println(s"b > c: $x") 
    case d(x) ⇒ println(s"d: $x") 
} 

इसी प्रकार के प्रश्न: Can extractors be customized with parameters in the body of a case statement (or anywhere else that an extractor would be used)?

फ़ीचर अनुरोध: SI-5435

+1

क्या आप वाकई भी मैच के लिए है कि क्या 'myMap' है चाहते हैं एक नक्शा? यह और क्या हो सकता है? – ziggystar

+0

आपके दूसरे मामले के खिलाफ मैच की उम्मीद क्या है? मेरा मैप कैसा दिखता है जैसे यह मेल खाता है? – Shadowlands

+0

यह एक सरलीकृत उदाहरण है। असल में, मैं NSObject से प्राप्त ऐप्पल कोको प्रकारों पर संचालन के लिए एक स्कैला लाइब्रेरी विकसित कर रहा हूं। विशेष रूप से, कार्य आईओएस प्लिस्ट फ़ाइल को पार्स करना है जो एक ही चीज़ का वर्णन करने के कई वैकल्पिक तरीकों से बहुत परिष्कृत है। –

उत्तर

1

शायद आप जिस समाधान की आवश्यकता नहीं है उसे ढूंढ रहे हैं? यहाँ निकालने वालों की कल्पना नहीं कर सकते हैं। आप पीएफ उपयोग कर सकते हैं आप कुंजी-मान जोड़ों मिलान करना चाहते हैं:

val map = Map[String, String]("a" -> "b") 

def matchTuple[A,B,C](map: Map[A,B])(pf: PartialFunction[(A,B), C]) = 
    map.collectFirst(pf) 

matchTuple(map) { 
    case ("a", b) => println("value for a is " + b) 
} 

वापसी प्रकार है क्योंकि हम का उपयोग collectFirst विकल्प [यूनिट] और println

+0

प्रकाशित किया गया है। आंशिक फ़ंक्शन की श्रृंखला और .lift के माध्यम से विकल्प और ized है जिस तरह से मैंने इस एल्गोरिदम को अभी तक लागू किया है। हालांकि, अगर मैं अधिक संक्षिप्त तरीके से करना संभव है तो मैं उत्सुक हूं। –

+1

मुझे लगता है कि यह गणितीय रूप से गलत कार्य है। अनियंत्रित मानचित्र के तत्व को खोजने के लिए मिलान का उपयोग अप्रत्याशित परिणाम दे सकता है –

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