Clojure中如何将可变参数函数的剩余参数传递给其他函数
Clojure 可变参数更新 map 集合的惯用写法
直接将 apply 作用于 update 函数即可实现参数的自动展开,无需额外包裹匿名函数:
(defn my-update [what item & items] (apply update what :desired-key conj item items))
原理说明
apply会将传入的最后一个序列(此处为items)的元素展开,和前面的所有参数拼接为完整的参数列表传递给update- 刚好匹配
update原生的多参数签名[m k f x y & more],conj会接收到所有独立的待添加元素,而非打包的序列 - 性能和可读性都优于包裹匿名函数的写法
如果需要适配任意键的通用更新,可以将键作为参数传入:
(defn my-update [what target-key item & items] (apply update what target-key conj item items))
原有写法问题说明
你最初的写法之所以不符合预期,是因为直接传入的 items 会作为单个序列参数传递给 conj,最终会把整个序列作为单个元素添加到 vector 中,而非逐个添加序列内的元素。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

