[英]dissoc in clojure can't get to work
我有这个功能:
(defn dissoc-all [m kv]
(let [[k & ks] kv]
(dissoc m k ks)))
其中, m
是映射, kv
是键的向量。 我这样使用它:
(dissoc-all {:a 1 :b 2} [:a :b])
=>{:b 2}
这不是我所期望的。 ks
有:b
但是我不知道为什么dissoc
没有使用dissoc
。 有人可以帮我吗?
编辑:添加的问题是,为什么这不触发dissoc
的第三重载,即dissoc [map key & ks]
?
正如noisesmith所说,将名称从dissoc-in更改为dissoc-all,-in不适用于此名称,我同意。
这是行不通的,因为ks
是第一个之后的kv
中所有元素的集合。 因此,不是:b
而是[:b]
。
相反,您可以只使用apply:
(defn dissoc-in [m vs]
(apply dissoc m vs))
而且, dissoc-in
是此函数的一个奇怪名称,因为名称中带有-in
的标准函数全部都进行嵌套访问,并且这不使用键进行地图的任何嵌套访问。
为什么不这样呢?
(defn dissoc-all [m ks]
(apply dissoc m ks))
(dissoc-all {:a 1 :b 2} [:a :b])
=> {}
第三overlod原因dissoc
是没有得到所谓的,因为它不希望像钥匙的集合[:a :b]
- ,预计只是按键。
例如:
(dissoc {:a "a" :b "b" :c "c" :d "d"} :a :b :c)
=> {:d "d"}
除了noisesmith的回答 :
你混淆通过的过载/ arities dissoc
,其中有这样的简单效果:
[m & ks]
"Returns a new map of the same (hashed/sorted) type,
that does not contain a mapping for any of ks. "
没有键和一个键的显式区域性是为了提高性能。 这样组织了许多Clojure功能,文档遵循了组织,而不是基础思想。
现在,动作
(dissoc-all {:a 1 :b 2} [:a :b])
;{:b 2}
是要绑定
k
至:a
ks
到[:b]
注意后者。 该示例删除了:a
但没有删除[:b]
,但没有删除。
您可以使用apply
来破解ks
:
(defn dissoc-all [m kk]
(let [[k & ks] kk]
(apply dissoc m k ks)))
(dissoc-all {:a 1 :b 2} [:a :b])
;{}
...或者更好的方法是,就像@noisesmith一样,立即使用apply
缩短解构过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.