2010-12-22 10 views
11

मैं कुछ स्कैला कोड का अध्ययन कर रहा हूं और मुझे यह तरीका मिला जो मुझे परेशान करता है। मैच स्टेटमेंट में, [email protected] निर्माण क्या है? इसमें किस तरह का मूल्य शामिल है? जब मैंने इसे मुद्रित किया तो tail से कोई भिन्न नहीं है, लेकिन अगर मैं इसे पूंछ से बदलता हूं, तो फ़ंक्शन भिन्न परिणाम देता है। क्या कोई यह समझा सकता है कि यह क्या है और इसे समझने के लिए मुझे सही संसाधन पर इंगित करें? (मुझे लगता है मैं गूगल में खोज सकते हैं पता है, लेकिन देखने के लिए क्या पता नहीं है ..)स्कैला "मैच" मदद

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

'@' आमतौर पर एनोटेशन में उपयोग किया जाता है, लेकिन मुझे यहां कुछ भी नहीं दिखता है ... –

उत्तर

28

मैं इसे "अपना केक खाऊंगा और इसे बहुत ऑपरेटर भी कहूंगा" कहूंगा। पैटर्न मिलान में किसी भी स्तर पर, आप एक भाग (नाम से पहले) का हिस्सा दे सकते हैं और इसे आगे बढ़ा सकते हैं (@ के बाद)। कल्पना उदाहरण के लिए आप 3 तत्वों के साथ एक सूची के खिलाफ मैच के लिए, आप, दूसरा तत्व की जरूरत चाहते हैं, लेकिन आप पूरी सूची प्रवेश करना चाहते हैं:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 
इस सुविधा के बिना

, आप

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 
की तरह कुछ लिखना पड़ा

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

+0

बहुत बढ़िया स्पष्टीकरण। धन्यवाद दोस्त!! –

8

इस उदाहरण में, sublist पूरी सूची (_ :: tail) के लिए एक नामित चर हो जाता है। पूंछ अच्छी तरह से सूची की पूंछ है। मुझे यकीन नहीं है कि यहां '@' के लिए उचित नाम है या नहीं।

मुझे वास्तव में यहां उपन्यास का उद्देश्य दिखाई नहीं देता है, क्योंकि आप सीधे ls का संदर्भ दे सकते हैं।

अस्वीकरण: मैं स्कैला के लिए नया हूं। मुझे उम्मीद है कि मुझे यह अधिकार मिला है।

+1

यह हैस्केल (और प्रोपेबल एमएल) में भी वही है। – delnan

+0

अरे, उत्तर के लिए धन्यवाद। दोनों उत्तरों ने मुझे समझने में मदद की। –

+10

इसे भाषा संदर्भ में 'पैटर्न बाइंडर' कहा जाता है। इस बिंदु के लिए – Debilski

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