2012-05-14 13 views
5

मैं मानचित्र पर clojure.walk/stringify-keys पर कॉल करने का प्रयास कर रहा हूं जिसमें रिकॉर्ड उदाहरण शामिल हो सकते हैं। चूंकि स्ट्रिंग-कुंजी रिकर्सिव है, इसलिए यह मेरे रिकॉर्ड पर चाबियाँ कन्वर्ट करने का प्रयास करता है, (क्योंकि (map? record-var) सत्य है) जो त्रुटि का कारण बनता है। क्या यह बताने का कोई तरीका है कि एक var क्लोजर मानचित्र के बजाय एक var रिकॉर्ड है या नहीं? मैं डी stringify-keys का अपना कार्यान्वयन प्रदान करना चाहता हूं जो रिकॉर्ड-जागरूक है।मानचित्र से रिकॉर्ड उदाहरण को अलग करना

stringify-keys का वर्तमान क्रियान्वयन का कारण बनता है निम्नलिखित:

(use '[clojure.walk :only [stringify-keys]]) 

(defrecord Rec [x])  

(let [record (Rec. "foo") 
     params {:x "x" :rec record}] 
    (stringify-keys params)) 

यह निम्नलिखित अपवाद का कारण बनता है: UnsupportedOperationException खाली नहीं बनाया जा सकता: user.Rec user.Rec (NO_SOURCE_FILE: 1)

उत्तर

5

रिकॉर्ड्स IRecord मार्कर इंटरफ़ेस को लागू करने लगते हैं:

user=> (defrecord Rec [x])  
user.Rec 

user=> (require '[clojure.reflect :as r]) 
nil 
user=> (:bases (r/reflect Rec)) 
#{java.io.Serializable clojure.lang.IKeywordLookup clojure.lang.IPersistentMap clojure.lang.IRecord java.lang.Object clojure.lang.IObj clojure.lang.ILookup java.util.Map} 

user=> (instance? clojure.lang.IRecord (Rec. "hi")) 
true 

अद्यतन 1.6 अब record? कार्य करता है

1

आप कर सकते हैं प्रत्येक सदस्य के प्रकार की जांच करें और देखें कि यह वास्तव में एक मानचित्र है या कुछ और है (जहां कुछ और रिकॉर्ड होने के लिए माना जाता है)

user> (type {:a 1 :b 2}) 
clojure.lang.PersistentArrayMap 
संबंधित मुद्दे