我正在尝试在可能包含记录实例的地图上调用clojure.walk/stringify-keys
。由于stringify-keys是递归的,它会尝试转换我的记录上的键(因为(map? record-var)
为真),这会导致错误。有没有办法判断var是一个记录而不仅仅是一个Clojure地图?一世
我想提供我自己的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)
答案 0 :(得分: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 :(得分:1)
您可以检查每个成员的类型,看看它是否真的是地图或其他东西(其他东西被认为是记录)
user> (type {:a 1 :b 2})
clojure.lang.PersistentArrayMap