从 Clojure 记录返回普通地图

2023-11-29

我有一个记录:

(defrecord Point [x y])
(def p (Point. 1 2))

现在我想从记录中提取地图。这些方法可以完成工作。这些是好方法吗?还有更好的方法吗?

(into {} (concat p))
(into {} (map identity p))
(apply hash-map (apply concat p))

我希望可能有一种更干净的方法,也许内置于记录的概念中。


Records are maps

(defrecord Thing [a b])

(def t1 (Thing. 1 2))
(instance? clojure.lang.IPersistentMap t1) ;=> true

所以,一般来说,没有必要强迫他们APersistentMap类型。但是,如果需要,您可以这样做into:

(into {} t1) ;=> {:a 1, :b 2}

如果要遍历任意数据结构(包括嵌套记录)进行此转换,则使用walk

(def t2 (Thing. 3 4))
(def t3 (Thing. t1 t2))
(def coll (list t1 [t2 {:foo t3}]))

(clojure.walk/postwalk #(if (record? %) (into {} %) %) coll)
;=> ({:a 1, :b 2} [{:a 3, :b 4} {:foo {:a {:a 1, :b 2}, :b {:a 3, :b 4}}}])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Clojure 记录返回普通地图 的相关文章

随机推荐