在Clojure中,apply和into将lazy seqs转换为其他类型有什么区别?

时间:2017-07-30 17:50:30

标签: clojure

在clojure中,我经常使用以下代码:

(into [] (range 3))

但是我已经看到了这个代码的使用:

(apply vector (range 3))

这两个代码示例之间有什么区别?比另一个更习惯吗?何时使用to init集合,以及何时使用apply + factory函数?

1 个答案:

答案 0 :(得分:8)

您调用它们的方式,两个函数的结果是相同的。但是,applyinto的语义完全不同。

  • 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))

最后但同样重要的是,两个调用的内存占用和性能可能存在差异,但它们在很大程度上取决于您的环境,如果您担心这一点,我建议您使用分析器。