我有这个功能:
(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 [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
的标准函数全部进行嵌套访问,并且这不使用键进行地图的任何嵌套访问。