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

MMa*_*ail 2 clojure

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

(into [] (range 3))
Run Code Online (Sandbox Code Playgroud)

但后来我看到这个代码被使用:

(apply vector (range 3))
Run Code Online (Sandbox Code Playgroud)

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

c-g*_*cia 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))
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的,有可能是在两个调用的内存占用和性能上的差异,但他们依靠这么多你的环境,我会建议,如果你关心这个使用分析器.

  • 仅供参考:`(范围3)`产生`(0 1 2)`,但你的答案的灵魂是现货.:-) (2认同)