Clojure 为什么';t(into{}x)接受x的序列
我有两个相关的问题:Clojure 为什么';t(into{}x)接受x的序列,clojure,Clojure,我有两个相关的问题: 为什么(into{})坚持将向量作为(键、值)对的容器 为什么它试图使用Long,这是对的组成部分,作为对本身?它不应该至少抱怨看到一个非向量,不管它包含什么 顺便说一句,使用Clojure 1.5.1进行测试。进入是在conj之上实现的 => (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x))) ClassCastException java.lang.Long cannot b
(into{})
坚持将向量作为(键、值)对的容器Long
,这是对的组成部分,作为对本身?它不应该至少抱怨看到一个非向量,不管它包含什么顺便说一句,使用Clojure 1.5.1进行测试。
进入
是在conj
之上实现的
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x)))
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (seq (map #(Long/parseLong %) x))))
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (vec (map #(Long/parseLong %) x))))
{1 2, 3 4}
conj
需要一个映射、映射条目或两元素向量。请参阅以下摘录:
conj期望另一个(可能是单个条目)映射作为项,并返回一个新映射,该映射是旧映射加上来自新映射的条目,这可能会覆盖旧映射的条目。conj还接受一个MapEntry或两个项(键和值)的向量
into
是在conj
之上实现的
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x)))
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (seq (map #(Long/parseLong %) x))))
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (vec (map #(Long/parseLong %) x))))
{1 2, 3 4}
conj
需要一个映射、映射条目或两元素向量。请参阅以下摘录:
conj期望另一个(可能是单个条目)映射作为项,并返回一个新映射,该映射是旧映射加上来自新映射的条目,这可能会覆盖旧映射的条目。conj还接受一个MapEntry或两个项(键和值)的向量
回答第二个问题:您正在将一系列序列传递到
中into
通过重复conj
ing(或conj!
ing,如果可能,结果是等效的)工作。在这里,每一步你都要从你的序列中提取一个项目,并把它连接到地图上。每个这样的项目都是由两个Long
s组成的序列。当您将序列conj
放到映射上时,conj
假定它是一个映射条目序列,并将每个元素强制转换为map$Entry
。
因此,在这里,它将尝试将Long
转换为映射$Entry
,以回答第二个问题:您正在将序列传递到中into
通过重复conj
ing(或conj!
ing,如果可能,结果是等效的)工作。在这里,每一步你都要从你的序列中提取一个项目,并把它连接到地图上。每个这样的项目都是由两个Long
s组成的序列。当您将序列conj
放到映射上时,conj
假定它是一个映射条目序列,并将每个元素强制转换为map$Entry
。
因此,在这里,它将尝试将您的Long
s转换为Map$Entry
这实际上也回答了第一个问题。这实际上也回答了第一个问题。