我有这个功能:

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

09-27 17:54