clojure can中的dissoc';我不能上班
我有这个功能:clojure can中的dissoc';我不能上班,clojure,Clojure,我有这个功能: (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] 将名称从d
(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]
将名称从dissoc in更改为dissoc all,正如noisesmith所说,-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])
=> {}
dissoc
的第三个overlod未被调用的原因是它不需要像[:a:b]
这样的密钥集合-它只需要密钥
例如:
(dissoc {:a "a" :b "b" :c "c" :d "d"} :a :b :c)
=> {:d "d"}
除此之外:
您被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
来缩短分解过程 对不起,您的名字,idk的任何标准:(你的意思是(:b)
?我还以为它将与dissoc[map key&ks]
?是的,在该示例中,解构将给你一个包含:b
的序列,作为ks
的绑定。由于Clojure的结构等式是如何工作的,因此可以更清楚地指示[:b]
,而不是(:b)
,也可以是函数调用。