2011-02-16 9 views
7

जाहिर है, आप एक रिकार्ड निर्माता के साथ लागू फोन नहीं कर सकते हैं:क्लोजर रिकॉर्ड कन्स्ट्रक्टर प्रथम श्रेणी नहीं है?

(defrecord Foo. [id field]) 

(apply Foo. my-list) 

क्योंकि यह फू की उम्मीद नहीं है पढ़ने के समय में विफल रहता है। उस स्थान पर।

(make-foo [id field] (Foo. id field)) 

जो निश्चित रूप से apply'ed जा सकता है:

केवल स्पष्ट तरीके को मैं के बारे में सोच सकता है एक कारखाने समारोह को जोड़ने के लिए किया गया था।

क्या मुझे कुछ याद आ रही है? मैं इसे सी #/जावा से उम्मीद करता हूं लेकिन सोचा था कि यह क्लोजर में थोड़ा निराशाजनक था ...

+0

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

उत्तर

10

इस उत्तर-1.3 पर वापस चक्कर ....

Clojure 1.3 में, defrecord दो उत्पन्न निर्माता कार्यों पैदा करता है। यह देखते हुए:

(->Person "alex" "miller") 

और एक नक्शे के निर्माता समारोह map->Person:

(defrecord Person [first last]) 

इस एक स्थितीय निर्माता समारोह ->Person पैदा करेगा क्योंकि यह नक्शा दिया गया है

(map->Person {:first "string"}) 

, सभी कुंजियों वैकल्पिक हैं और निर्मित वस्तु में एक शून्य मूल्य ले लो।

आपको उन कार्यों को एनएस से उपयोग/उपयोग करना चाहिए जहां आप रिकॉर्ड घोषित करते हैं, लेकिन आपको जावा क्लास कन्स्ट्रक्टर का उपयोग करते समय रिकॉर्ड क्लास आयात करने की आवश्यकता नहीं है।

अधिक विवरण:

+0

अपडेट के लिए बहुत धन्यवाद! –

3

समस्या ज्ञात है और क्लोजर मेलिंग सूची पर इसके बारे में बहुत सी बात है। भविष्य में क्लोजर संस्करणों में शायद अधिक समर्थन जोड़ा जाएगा।

  • निर्माता के रूप में clojure समारोह प्रदान
  • नामित पैरामीटर स्वीकार (एक eval'able रूप में

    • प्रिंट:

      अभी के लिए आप अपने खुद के कार्यों का उपयोग या https://github.com/david-mcneil/defrecord2 जो जैसी कुछ सुविधाओं का समर्थन करता है का उपयोग करने के नक्शे) निर्माता

    • में/पोस्ट की पैदल दूरी पर बहु ​​विधि पूर्व में भाग लेने
  • 6

    Foo. एक जावा क्लास कन्स्ट्रक्टर है, इसलिए इसमें सामान्य जावा इंटरऑप बाधाएं हैं जिन्हें आप इसे कॉल करते हैं। एक कन्स्ट्रक्टर फ़ंक्शन बनाना एक आम समाधान है (इसका अर्थ यह भी है कि आपको किसी भिन्न नामस्थान में Foo आयात करने की आवश्यकता नहीं है)।

    +0

    यह जावा क्लास सीटीओ शू है एलडी एक कार्यान्वयन विस्तार हो? मैंने देखा कि यह बेहतर प्रदर्शन विशेषताओं के साथ "नया" defstruct था। –

    +0

    मेरी इच्छा है कि यह केवल एक कार्यान्वयन विस्तार था लेकिन यह मामला नहीं है (अभी तक)। –

    +0

    पोस्ट-1.3 के लिए मेरा दूसरा उत्तर देखें। जावा क्लास प्रकृति को अब बड़े पैमाने पर अनदेखा किया जा सकता है। –

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