我想编写一个函数,它只是用新值更新地图中的向量,但可以采用任意数量的参数,但至少可以采用一个。
这是示例:
(defn my-update [what item & items]
(update what :desired-key conj item items))
不幸的是,这行不通。尽管它update
确实有一个带有多个值的签名(如[m k f x y]
),但所有剩余的参数都my-update
将被连接到一个序列中,该序列将conj
作为一个参数传递给。
相反,conj
用apply
匿名函数包装确实有效,但看起来不那么优雅:
(defn my-update [what item & items]
(update what :desired-key #(apply conj % item items))
编写这样一个函数的惯用方式是my-update
什么?
您可以简单地在之前插入applyupdate
。这将update
使用后面的参数调用函数,除了最后一个参数应该是一个序列,其元素成为调用中的剩余参数:
(defn my-update [what item & items]
(apply update what :desired-key conj item items))
(my-update {:desired-key [0]} 1 2 3 4)
;; => {:desired-key [0 1 2 3 4]}
(my-update {:desired-key [0]})
;; Exception: Wrong number of args (1) passed to: my-update
这样,您可以保留函数参数列表[what item & items]
,以明确至少需要提供一项。
通常,调用(apply f a b c ... [x y z ...])
将评估为与(f a b c ... x y z ...)
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句