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



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

(into [] (range 3))

但是后来我看到使用了这段代码:

(apply vector (range 3))

这两个代码示例之间有什么区别?一个比另一个更惯用吗?何时使用 into 来初始化集合,何时使用 apply + factory 函数?

你调用它们的方式,两个函数的结果是相同的。但是,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))

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

最新更新