2016-05-05 4 views
9

मैं का उपयोग क्लोजर में फ़ंक्शन को पुनः समझ नहीं पाया। क्लोजर में इसका उपयोग क्या किया जाता है?क्लोजर में क्या सुधार है?

क्या आप उदाहरण प्रदान कर सकते हैं?

+0

वहाँ दस्तावेज़ पृष्ठ पर उदाहरण हैं: https://clojuredocs.org/clojure.core/ – OlegTheCat

उत्तर

15

reify मैक्रो java.lang.Object कक्षा और/या निर्दिष्ट इंटरफेस/प्रोटोकॉल को लागू करने वाले अज्ञात वर्ग को बनाने की अनुमति देता है। API docs स्पष्ट रूप से उद्देश्य का वर्णन नहीं करते हैं बल्कि तकनीकी विवरण प्रदान करते हैं कि मैक्रो क्या करता है। , वस्तु के बारे में जैसे सोचना

Clojure 1.2 के रूप में भी इंटरफेस को लागू करने के लिए उपलब्ध है: Java interop documentation उद्देश्य का एक संक्षिप्त विवरण प्रदान करता है।

इससे भी अधिक जानकारी datatypes documentatio में पाया जा सकता n जहाँ आप एक बहुत विस्तृत वर्णन यह क्या करता है पा सकते हैं और यह कैसे proxy की तुलना:

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

पुनर्मूल्यांकन के विधि निकाय लेक्सिकल बंद हैं, और आसपास के स्थानीय दायरे को संदर्भित कर सकते हैं। प्रतिफल प्रॉक्सी से भिन्न है:

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

+0

को दोबारा बढ़ाएं आप 'रीफाई' के साथ एक वर्ग (ऑब्जेक्ट' के अलावा) का विस्तार नहीं कर सकते हैं, इसलिए आपकी पहली वाक्य थोड़ा गलत है। –

+0

@NathanDavis हां, आप सही हैं, मैंने अपना जवाब तय कर दिया है। –

24

reifydefrecord क्या fndefn है के लिए है।

बस रखो "आह सही ...... तो क्या reify है", प्रोटोकॉल कार्यों एक डेटाप्रकार का समर्थन करना चाहिए, रिकॉर्ड की सूची डेटाटाइप्स कर रहे हैं और reifications गुमनाम datatypes हैं।

हो सकता है कि यह घना है, लेकिन reify प्रोटोकॉल और प्रकार/रिकॉर्ड को समझे बिना वस्तुतः नहीं समझा जा सकता: प्रोटोकॉल conj के रूप में एक समारोह ऐसा है कि वास्तव में अलग तरह से काम करता है के लिए एक ही नाम का उपयोग करने के लिए एक तरह से जब विभिन्न तर्क दिए गए हैं ((conj [:b :c] :a) => [:b :c :a] लेकिन (conj '(:b :c) :a) => (:a :b :c))। रिकॉर्ड्स ऑब्जेक्ट्स या प्रकारों की तरह होते हैं (लेकिन वे उन्हें अजीब बनाने वाले मानचित्रों की तरह कार्य करते हैं)।

अधिक मौलिक, लक्ष्य हल करने के लिए "अभिव्यक्ति समस्या" करने की क्षमता मूल कि मौजूदा काम करता है, और नए कार्यों कि मौजूदा डेटा साथ समेकित रूप से काम के साथ काम डेटा के नए प्रकार जोड़ने के लिए है।

तो एक दिन आप अपने आप से कहते हैं, "स्वयं, आपको सीखना चाहिए कि इसका बतख क्या है!" ताकि आप एक प्रोटोकॉल लिखें:

(defprotocol Quacks 
    (quack [_] "should say something in ducky fashion")) 

लेकिन यह सब आप असली ify 'भी सार है, इसलिए इसमें:

(def donald (reify Quacks 
        (quack [_] "Quacks and says I'm Donald"))) 

अब पिछले आप अपनी रचना का अनुभव कर सकते हैं:

(quack donald) => "Quacks and says I'm Donald" 

फिर आपको डैफी के बारे में याद है:

(def daffy (reify Quacks 
        (quack [_] (str "Quacks and says I'm Daffy")))) 

(quack daffy) => "Quacks and says I'm Daffy" 

लेकिन आप ह्युई के बारे में याद समय तक, आप अपनी गलती का एहसास है और परिभाषित क्या एक बतख एक पुन: प्रयोज्य तरह से है:

(defrecord Duck [name] 
    Quacks 
    (quack [_] (str "Quacks and says I'm " name))) 

और new बतख बनाने (वहाँ यह करने के लिए कई तरीके हैं):

(def huey (->Duck "Huey")) 
(def duey (Duck. "Duey")) 
(def louie (new Duck "Louie")) 

(quack huey) => "Quacks and says I'm Huey" 

याद रखें कि रिकॉर्ड नक्शे की तरह कार्य (प्रोटोकॉल के लिए धन्यवाद!):

(:name huey) => "Huey" 

लेकिन तब आपको याद है कि बतख हैं न केवल चीजें हैं जो नीम हकीम, इसलिए आपको कोई प्रोटोकॉल लिखें:

(defprotocol Walks 
    (walk [_] "should walk like a duck")) 

और बतख की परिभाषा

(extend-type Duck 
    Walks 
    (walk [_] "waddle waddle")) 

(walk louie) => "waddle waddle" 

अब हम अन्य प्रकार का विस्तार ही प्रोटोकॉल को लागू कर सकते हैं का विस्तार (समान सिखाना समारोह कैसे अन्य बातों के साथ काम करने के लिए):

तो चलो कहते हैं कि हम प्रोग्रामर भी :-)

(defrecord Programmer [] Quacks 
    (quack [_] "Monads are simply monoids in a category of endofunctors...")) 

(quack (Programmer.)) => "Monads are simply monoids in a category of endofunctors..." 
नीम हकीम करना चाहते हैं

मैं इस महान explanation of protocols, explanation of reify और chapter on protocols in "Clojure for the Brave and True" की अनुशंसा करता हूं।

अस्वीकरण: यह केवल प्रोटोकॉल की शुरुआती समझ देने के लिए है, उनका उपयोग करने के तरीके पर सर्वोत्तम अभ्यास। "Psst! मैंने इस सवाल का जवाब बड़े पैमाने पर खुद को सिखाने के लिए दिया, क्योंकि कल तक मैंने कभी अपना खुद का प्रोटोकॉल/इंटरफेस नहीं लिखा था!" !।

इसलिए जब मुझे आशा है कि यह किसी और के सीखने को बढ़ाता है, मैं करता हूँ दिल से स्वागत आलोचना या संपादित-सुझाव "

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