clojure 行为 (into {} '(( :a :b) (:c :d)))

标签 clojure

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/

相关文章:

clojure - 如何从 Clojure 异常中提取元数据?

regex - 用于突出显示 Lisp 函数调用中的函数引用的语法高亮规则

java - 一个正则表达式来匹配一个子字符串,该子字符串后面没有某个其他子字符串

clojure - 如何在 Ring-Compojure 应用程序上设置 Content-Type header

clojure - 为什么 get-in 比线程 get 慢?

shell - 从特定位置在 Clojure 中运行 shell 命令

css - 如何使用 html5 标签在 Clojure 中设置 hiccup 中 css 的文件路径?

java - 如何获取java类常量池中的常量映射列表?

debugging - 调试 Clojure 函数的推荐方法?

clojure - Clojure 程序的特定软件指标