(进入{}';(:a:b)(:c:d))的clojure行为

(进入{}';(:a:b)(:c:d))的clojure行为,clojure,Clojure,抛出:ClassCastException clojure.lang.Keyword不能强制转换为java.util.Map$Entry clojure.lang.ATransientMap.conj(ATransientMap.java:44) 鉴于: user=> (into {} '((:a :b) (:c :d))) 很好。这是一个奇怪的区别,因为很多时候其他函数返回列表时,它们必须以向量开头: user=> (into {} (list [:a :b] [:c :d]))

抛出:
ClassCastException clojure.lang.Keyword不能强制转换为java.util.Map$Entry clojure.lang.ATransientMap.conj(ATransientMap.java:44)

鉴于:

user=> (into {} '((:a :b) (:c :d)))
很好。这是一个奇怪的区别,因为很多时候其他函数返回列表时,它们必须以向量开头:

user=> (into {} (list [:a :b] [:c :d]))
将抛出,因为它
分区2…
导致
(:a:c)(:b:d))
。所以这很烦人。基本上,您必须将方法的返回类型和函数的特定行为(如
存储到
)中,或者您必须让东西爆炸,然后使用
(存储到{}(map-vec(分区2(interleave[:a:b][:c:d]))之类的东西修复它


into
不喜欢将对作为列表的原因是什么?

原因是,正如您所说,只有向量对可以用于构建地图。我不知道这种限制存在的实际原因。但是也有其他几种方法来构造哈希映射。如果您发现自己正在使用分区,那么答案可能是使用另一种构造方法

如果有平行的键和值序列:

user=> (into {} (partition 2 (interleave [:a :b] [:c :d])))
如果所有项目都按平面顺序排列:

(zipmap [:a :c] [:b :d])
(apply hash-map [:a :b :c :d])
根据序列构建地图:

(zipmap [:a :c] [:b :d])
(apply hash-map [:a :b :c :d])

我从未意识到这是行不通的!别忘了:

(into {} (for [[k v] xs]
           [k (transform v)]))
由于
哈希映射
隐式地从标量参数创建对:

(apply hash-map (interleave [:a :b] [:c :d]))
;=> {:b :d, :a :c}

您并不真正需要问题的根源
(分区2…

into
可能是建立在
conj
之上的
(conj{}(:a:b))
=>
java.lang.ClassCastException:clojure.lang.Keyword不能转换为java.util.Map$Entry
,这将问题改为为什么
conj
在连接到映射时只接受向量对。是的,不确定为什么我没有想到
(应用哈希映射…
)。谢谢