【问题标题】:Distinguishing a record instance from a map从地图中区分记录实例
【发布时间】:2012-05-14 18:51:11
【问题描述】:

我正在尝试在可能包含记录实例的地图上调用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 Can't create empty: user.Rec user.Rec (NO_SOURCE_FILE:1)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    Records 似乎实现了 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? 函数

    【讨论】:

      【解决方案2】:

      您可以检查每个成员的类型,看看它是否真的是地图或其他东西(假设其他东西是记录)

      user> (type {:a 1 :b 2})
      clojure.lang.PersistentArrayMap
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 2022-12-03
        • 2021-06-13
        • 1970-01-01
        相关资源
        最近更新 更多