我有一个散列图向量,如下所示:
(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')我做错了什么?
发布于 2021-12-03 11:11:10
发布于 2021-12-03 16:22:01
为了清晰起见,下面是一个更一般的答案,分为几个步骤:
(let [my-maps [{:a 1} {:b 2 :c 3}]]
(doseq [curr-map my-maps]
(newline)
(println "curr-map=" curr-map)
(let [map-entries (seq curr-map)]
(println "map-entries=" map-entries)
(doseq [curr-me map-entries]
(let [[k v] curr-me]
(println " curr-me=" curr-me " k=" k " v=" v))))))有结果
curr-map= {:a 1}
map-entries= ([:a 1])
curr-me= [:a 1] k= :a v= 1
curr-map= {:b 2, :c 3}
map-entries= ([:b 2] [:c 3])
curr-me= [:b 2] k= :b v= 2
curr-me= [:c 3] k= :c v= 3Clojure中的MapEntry对象可以被看作是一个2元素向量(通过first &second访问),也可以看作是通过key和val函数访问的MapEntry。破坏形式:
(let [[k v] curr-me] 将MapEntry对象curr-me视为序列,并将前2个元素提取到k和v中。尽管它的打印方式类似于向量(如[:a 1]),但它确实具有clojure.lang.MapEntry类型。
原始答案的& _表达式中的析构语法for是一个"rest“解构。它导致将第一个MapEntry对象之后的所有_对象的顺序分配给变量_,然后在代码的其余部分中忽略该变量。
https://stackoverflow.com/questions/70213197
复制相似问题