Clojure 使用dissoc';什么是一元版本?
在使用dissoc时,我注意到它有一个一元版本,它似乎没有任何作用。我检查了源代码,结果发现它只是标识函数:Clojure 使用dissoc';什么是一元版本?,clojure,arity,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)) re
(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))))
然后我注意到disj
也有一个一元版本,具有相同的定义
一元版本的目的是什么?我能看到的唯一潜在用途可能是当它们与apply
一起使用时,但我看不出这有什么用处。为什么它们的conj
和assoc
对应项没有类似的一元版本呢?考虑(应用dissoc删除一些映射项)
如果一元表单不存在,
要删除的项
为空将是一个错误,因此在进行此调用之前需要始终检查其长度。考虑(应用dissoc一些要删除的映射项)
。当要删除的项为空时,您真的希望它是一个错误,从而迫使任何使用该习惯用法的人将其包装在条件中吗?这与+
的0参数和1参数版本完全相同。@CharlesDuffy这是一个很好的观点。我想它没有点击,因为我以前从未在任何函数上使用过apply
。如果你写一个答案,我会接受的。因此,conj
和assoc
也应该是一元身份。JIRA罚单会招手吗?@thumboil我想说,任何使用apply
和conj
的用法都应该被替换为。对于将apply
与assoc
一起使用,它似乎并不那么简单;您可以使用#(进入%1(映射向量(所有2%2分区))
,但这相对较长。@Thumbnailconj
自1.7.0以来一直有一元重载。它在(docconj)
中被模糊了,同时引入的空值重载也是如此。通过更新:arglists
(带有补丁)来修复此问题的票据:@SamEstep到
可能更可取,Sam。但这是一个不同的问题。关键在于一致性和一致性。如果conj
(或assoc
)在第一个参数之后接受多个(对)参数,它应该不接受任何参数:conj
接受,而assoc
不接受<代码>列表*
-是cons
的扩展,只接受一个参数。@MichałMarczyk谢谢。以后我就不会那么轻信了。