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

时间:2016-06-07 21:47:57

标签: clojure

pip2 install pillow

抛出: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这样的东西。 / p>

(into {} (map vec (partition 2 (interleave [:a :b] [:c :d]))))不喜欢这些对作为列表的具体原因是什么?

2 个答案:

答案 0 :(得分:2)

原因在于,您只能使用矢量对来构建地图。我不知道存在这种限制的实际原因。但是还有其他几种构造哈希映射的方法。如果您发现自己使用分区,或许答案是使用替代构造方法。

如果您有并行的键和值序列:

(zipmap [:a :c] [:b :d])

如果所有项目都是平面序列:

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

从序列构建地图:

(into {} (for [[k v] xs]
           [k (transform v)]))

答案 1 :(得分:1)

我从未意识到这不起作用!别忘了:

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

因为hash-map隐式地从标量args创建对:

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

你真的不需要(partition 2...)这是问题的根源。