user=> (into {} '((:a :b) (:c :d)))
抛出:ClassCastException clojure.lang.Keyword cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
。
鉴于:
user=> (into {} (list [:a :b] [:c :d]))
很好。这是一个奇怪的区别,因为很多时候其他函数在必须以向量开头的东西时返回列表:
user=> (into {} (partition 2 (interleave [:a :b] [:c :d])))
将抛出,因为它 partition 2 ...)
导致 ((:a :c) (:b :d))
。所以这很烦人。你基本上必须记住方法的返回类型和函数的特定行为,如 into
,或者你必须让东西爆炸并在你找到它时用 (进入 {} (map vec (partition 2 (interleave [:a :b] [:c :d]))))
。
into
不喜欢将这些对作为列表有什么具体原因吗?
最佳答案
原因如您所述,只能使用向量对来构建 map 。我不知道存在此限制的实际原因。但是还有其他几种构造 HashMap 的方法。如果您发现自己正在使用分区,也许答案是使用替代构造方法。
如果您有键和值的并行序列:
(zipmap [:a :c] [:b :d])
如果您的所有项目都按平面顺序排列:
(apply hash-map [:a :b :c :d])
从序列构建 map :
(into {} (for [[k v] xs]
[k (transform v)]))
关于clojure 行为 (into {} '(( :a :b) (:c :d))),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37689961/