(进入{}';(: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
在连接到映射时只接受向量对。是的,不确定为什么我没有想到(应用哈希映射…
)。谢谢