在clojure中,我经常使用以下代码:
(into [] (range 3))
但是我已经看到了这个代码的使用:
(apply vector (range 3))
这两个代码示例之间有什么区别?比另一个更习惯吗?何时使用to init集合,以及何时使用apply + factory函数?
答案 0 :(得分:8)
您调用它们的方式,两个函数的结果是相同的。但是,apply
和into
的语义完全不同。
apply
用于通过一组参数来评估作为参数接收的函数,这些参数也作为参数接收。 (apply vector (range 3))
会调用(vector 0 1 2)
into
通过重复应用conj
将集合缩减为另一个集合。 (into [] (range 3))
会产生(conj (conj (conj [] 0) 1) 2)
。关于哪一个更惯用,这进入了意见领域。我建议在你的特定情况下使用任何显示意图。我可能会将into
用于您在注释中引发的特定用例(从惰性seq构建具体类型)。我认为它更容易阅读:
(into [] (get-the-lazy-seq))
;; vs
(apply vector (get-the-lazy-seq))
最后但同样重要的是,两个调用的内存占用和性能可能存在差异,但它们在很大程度上取决于您的环境,如果您担心这一点,我建议您使用分析器。