clojure - 从 Clojure 记录返回普通 map

标签 clojure records

我有一个记录:

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

现在我只想从记录中提取 map 。这些方法可以完成工作。这些是好方法吗?有更好的方法吗?
(into {} (concat p))
(into {} (map identity p))
(apply hash-map (apply concat p))

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

最佳答案

记录就是 map

(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}}}])

关于clojure - 从 Clojure 记录返回普通 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24977826/

相关文章:

database - Firebase 中有多少记录/行/节点?

production - 在 CloudKit 中将记录从开发移动到生产

clojure - 检查Clojure中的NaN

clojure - 使用 boot-clj 创建正确的关于信息

clojure - defmulti vs defprotocol?

ios - 在 iOS 中创建多维数组

php - 如何将链接添加到 mysql 数据库记录作为 <html> href?

clojure - 如何在 clj-webdriver 中为 phantomjs 驱动程序设置 useragent?

dynamic - 为什么 Clojure 是动态类型的?

clojure - 将多个 html 片段文件与 enlive、clojure 结合起来