繁体   English   中英

Clojure中的Dissoc无法开始工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM