【发布时间】:2022-01-09 18:08:33
【问题描述】:
我有一个哈希映射向量,如下所示:
(def my-maps [{:a 1} {:b 2}])
我想遍历每个哈希映射,在循环中给键和值一个更有意义的名称,然后根据其键以不同的方式处理每个哈希映射。
事不宜迟,这是我最好的尝试:
(for [m my-maps]
(let [my-key-name (key m) my-val-name (val m)]
(case my-key-name
:a (println "Found key :a with value " my-val-name)
:b (println "Found key :b with value " my-val-name))))
然而,这种方法会产生一个相当神秘的错误:
; Error printing return value (ClassCastException) at clojure.core/key (core.clj:1569).
; class clojure.lang.PersistentArrayMap cannot be cast to class java.util.Map$Entry (clojure.lang.PersistentArrayMap is in unnamed module of loader 'app'; java.util.Map$Entry is in module java.base of loader 'bootstrap')
我做错了什么?
【问题讨论】:
-
每次执行
for的主体时,m都会绑定到一个地图。key和val函数需要地图 entry,而不是地图本身。如果您确定每张地图只有一个元素,请尝试将m重新绑定到(first m)。 -
要使用解构,您可以简单地
(let [[my-key my-val] (first m)] ...),因为映射条目是索引集合。
标签: vector clojure key-value destructuring