使用dissoc的一元版本?

Car*_*ate 2 clojure arity

在使用时dissoc,我注意到它有一个单一的版本似乎没有做任何事情.我检查了源代码,结果证明它只是身份函数:

(defn dissoc
  ([map] map)
  ([map key]
   (. clojure.lang.RT (dissoc map key)))
  ([map key & ks]
   (let [ret (dissoc map key)]
     (if ks
       (recur ret (first ks) (next ks))
       ret))))
Run Code Online (Sandbox Code Playgroud)

然后我注意到它disj有一个一元版本以及相同的定义.

一元版本的目的是什么?我可以看到的唯一潜在用途可能是它们一起使用时apply,但我不知道这有什么用处.为什么他们conjassoc同行没有类似的一元版本呢?

Cha*_*ffy 5

考虑(apply dissoc some-map items-to-remove).

如果一元形式不存在,items-to-remove则为空将是一个错误,因此在进行此调用之前需要始终检查其长度.

  • @Thumbnail` conj`自1.7.0以来一直有一元过载.它在`(doc conj)中是模糊的,因为确实是同时引入的nullary重载.通过更新`:arglists`(带补丁)修复该问题的故障单:https://dev.clojure.org/jira/browse/CLJ-2169 (2认同)