2013-03-02 4 views
6

क्लोजर 1.5.0 में एक कस्टम विधि का उपयोग करके रिकॉर्ड को सुंदर प्रिंट करना, मैं अपने रिकॉर्ड प्रकार के लिए एक कस्टम सुंदर-प्रिंटर कैसे प्रदान कर सकता हूं, जिसे डिफ्रेकॉर्ड के साथ परिभाषित किया गया है।क्लोजर

(defrecord MyRecord [a b]) 

(defmethod print-method MyRecord [x ^java.io.Writer writer] 
    (print-method (:a x) writer)) 

(defmethod print-dup MyRecord [x ^java.io.Writer writer] 
    (print-dup (:a x) writer)) 

(println (MyRecord. 'a 'b)) ;; a -- OK 
(clojure.pprint/pprint (MyRecord. 'a 'b)) ;; {:a a, :b b} -- not OK, I want a 

मैं चाहूँगा clojure.pprint/pprint भी मेरी cutsom प्रिंटर का उपयोग करने (जो अब, बस बहुत-प्रिंट जो कुछ भी क्षेत्र समझाने के उद्देश्य से रिकॉर्ड की a में है चाहिए)।

उत्तर

8

clojure.pprint नामस्थान विभिन्न प्रेषण तंत्र का उपयोग करता है तो clojure.core प्रिंट फ़ंक्शंस। पीप्रिंट को कस्टमाइज़ करने के लिए आपको with-pprint-dispatch का उपयोग करने की आवश्यकता है।

(clojure.pprint/with-pprint-dispatch print ;;Make the dispatch to your print function 
    (clojure.pprint/pprint (MyRecord. 'a 'b))) 

सरल डिस्पैचर को अनुकूलित करने के लिए, की तरह कुछ जोड़ें:

(. clojure.pprint/simple-dispatch addMethod MyRecord pprint-myrecord) 
+0

बस यहाँ इस छोड़ने क्योंकि यही कारण है कि मैं यहां पहुंचे है: 'pprint-myrecord' कार्य करने के लिए लिखना चाहिए' * * ', एक स्ट्रिंग वापस नहीं बाहर। – pascal

0

हो सकता है कि आदर्श नहीं है, लेकिन मैं की तुलना में बेहतर pr और pr-str नहीं मिली है।

उदाहरण आरईपीएल सत्र:

(ns my-ns) 

    (defprotocol Foo 
    (bazfn [this])) 

    (defrecord Bar [a] 
    Foo 
    (bazfn [this] 123)) 


    (pr-str (Bar. "ok")) ;;=> "#my_ns.Bar{:a \"ok\"}" 
    (pr (Bar. "ok"))  ;; prints the same as above