2011-01-03 9 views
18

मैं एक सार तत्व बनाना चाहता हूं जो डेटाबेस तालिका का प्रतिनिधित्व करता है, लेकिन जिसे सभी सामान्य क्लोजर सीक्यू और कॉंज और सभी फैंसी सामानों का उपयोग करके एक्सेस किया जा सकता है। क्या कोई प्रोटोकॉल जोड़ने की ज़रूरत है?क्लोजर में मैं अपने स्वयं के रिकॉर्ड और प्रकारों पर मानक क्लोजर संग्रह इंटरफेस कैसे कार्यान्वित कर सकता हूं?

+1

क्या कोई कारण है कि रिकॉर्ड का वेक्टर एक प्रतिनिधित्व के रूप में अपर्याप्त है? (मेरा मतलब यह एक गंभीर सवाल है, न कि स्नैक्स)। बंद करने का एपीआई इस तरह के एक अमूर्तता के साथ काम करेगा। क्लोजर के तर्क से http://clojure.org/rationale - "10 डेटा संरचनाओं पर 10 कार्यों को संचालित करने के बजाय 100 कार्यों को एक डेटा संरचना पर संचालित करना बेहतर है।" - एलन जे पेरलिस –

+0

कारण यह है कि जब मैं वेक्टर में कोई आइटम जोड़ता हूं, तो मैं चाहता हूं कि आइटम स्वचालित रूप से डेटास्टोर पर बने रहें, और कोई तरीका नहीं है कि मैं इसे छुपा सकता हूं कि conj या cons या फिर जो भी फ़ंक्शन है वेक्टर के लिए। – Zubair

+3

इस तरह की चीज़ के साथ सुपर, सुपर सावधान रहें। यदि आप डीबी अपरिवर्तनीय नहीं हैं तो आप मूल रूप से क्लोजर के लिए अपने अर्थशास्त्र के बारे में झूठ बोल रहे हैं, यह बहुत जल्दी गलत हो सकता है। क्लोजर का अधिकांश विचार इस विचार पर बनाया गया है कि संग्रह अपरिवर्तनीय हैं। चूंकि इस तरह की कई धारणाएं होती हैं कि कुछ कार्य कैसे कार्य करते हैं। उदाहरण के लिए, संग्रह पर conj का उपयोग संग्रह को बदलना नहीं चाहिए। इसे एक नया संग्रह वापस करना चाहिए। इस नियम को तोड़ने से क्लोजर के काम बहुत अजीब तरीके से विफल हो सकते हैं। –

उत्तर

15

हां। प्रोटोकॉल जावा इंटरफ़ेस clojure.lang.ISeq द्वारा परिभाषित किया गया है। आप clojure.lang.ASeq का विस्तार करना चाहते हैं जो इसके एक अमूर्त कार्यान्वयन प्रदान करता है।

यहां एक उदाहरण है: seq एक संसाधन का अमूर्त जो बंद करने योग्य है और seq समाप्त होने पर स्वचालित रूप से बंद हो जाता है। (कठोर परीक्षण नहीं किया गया)

(deftype CloseableSeq [delegate-seq close-fn] 
    clojure.lang.ISeq 
    (next [this] 
     (if-let [n (next delegate-seq)] 
     (CloseableSeq. n close-fn) 
     (.close this))) 
    (first [this] (if-let [f (first delegate-seq)] f (.close this))) 
    (more [this] (if-let [n (next this)] n '())) 
    (cons [this obj] (CloseableSeq. (cons obj delegate-seq) close-fn)) 
    (count [this] (count delegate-seq)) 
    (empty [this] (CloseableSeq. '() close-fn)) 
    (equiv [this obj] (= delegate-seq obj)) 
    clojure.lang.Seqable 
    (seq [this] this) 
    java.io.Closeable 
    (close [this] (close-fn))) 
+0

तो क्या मैं विस्तारप्रोटोकॉल सिंटैक्स का उपयोग करता हूं? – Zubair

+0

एक उदाहरण के साथ उत्तर अद्यतन किया गया। –

+0

शानदार, धन्यवाद – Zubair

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