आप एस-भाव करने के लिए चीजों को क्रमानुसार करने चाहते हैं तो आपके print-dup
इस्तेमाल कर सकते हैं:
(binding [*print-dup* true] (println [1 2 3]))
; prints [1 2 3]
(defrecord Foo [x])
; => user.Foo
(binding [*print-dup* true] (println (Foo. :foo)))
; prints #=(user.Foo/create {:x :foo})
ध्यान दें कि एक संरचना है, जो रखती है कहते हैं, मुद्रण एक भी वेक्टर के लिए दस संदर्भ इसे पढ़ने वापस के बाद आप देता है दस अलग (identical?
) के साथ एक डेटास्ट्रक्चर, हालांकि संरचना के संदर्भ में समतुल्य (=
) वैक्टर।
उन मामलों में इसका उपयोग करने के लिए जहां कोई डिफ़ॉल्ट कार्यान्वयन नहीं है, multimethod clojure.core/print-dup
लागू करें।
इसके अलावा, Clojure में बहुत कुछ 1.2 java.io.Serializable
हैं:
(every? (partial instance? java.io.Serializable)
[{1 2} #{"asdf"} :foo 'foo (fn [] :foo)])
; => true
(defrecord Foo [])
(instance? java.io.Serializable (Foo.))
; => true
ध्यान दें कि आप serializing क्रम-निर्मित fn
रों से बचना चाहिए - वे अजीब नाम के साथ एक बंद वर्गों के उदाहरण हैं और आप जीता वैसे भी अपने JVM को पुनरारंभ करने के बाद उन्हें deserialize करने में सक्षम नहीं हैं। एओटी संकलन के साथ, fn
एस अपने स्वयं के निश्चित वर्ग नाम प्राप्त करते हैं।
अद्यतन: प्रश्न पर एक टिप्पणी में उल्लेख किया है, Serializable
, सबसे अच्छा अल्पकालिक भंडारण/डेटा के हस्तांतरण के लिए अनुकूल है, जबकि print-dup
एक लंबी अवधि के भंडारण समाधान (के कई संस्करणों में काम कर रहे के रूप में और अधिक मजबूत होना चाहिए आवेदन, क्लोजर इत्यादि)। इसका कारण यह है कि print-dup
धारावाहिक होने वाले वर्गों की संरचना पर निर्भर नहीं है (इसलिए वेक्टर print-dup
'डी आज भी पठनीय होगा जब वेक्टर कार्यान्वयन जावा से क्लोजर के deftype
पर स्विच हो जाएगा)।
स्रोत
2010-07-21 16:57:26
क्लोजर के बारे में बहुत कुछ जानने के बिना, क्या क्लोजर से लागू मानक जावा धारावाहिक तंत्र का उपयोग करके यह प्राप्त नहीं किया जा सकता है? – Gian
@Gian - हाँ यह निश्चित रूप से संभव है, लेकिन मैं चीजों को करने का "क्लोजर तरीका" सीखने की कोशिश कर रहा हूं :-) – mikera
आईएमओ क्लोजर तरीका जावा की सुविधाओं का उपयोग करना है जहां वे संबोधित समस्याओं के लिए अच्छे समाधान प्रदान करते हैं। :-) 'सीरियलज़ेबल' डेटा संरचनाओं के अल्पकालिक भंडारण/हस्तांतरण के लिए एक अच्छा समाधान हो सकता है। ऐसा कहकर, मुझे लगता है कि इस उपयोग के मामले में लंबी अवधि के भंडारण के लिए बेहतर प्रारूप उपयुक्त है और यह 'प्रिंट-डुप्ल' द्वारा प्रदान किया जा सकता है। ('Serializable' समस्याएं हो सकती है, अगर कहें, कोर क्लोजर डेटा संरचनाओं को लागू करने वाले वर्गों की संरचना में परिवर्तन होता है;' प्रिंट-डुप्ली 'संभवतः नहीं होगा।) –