在clojure中,我经常使用以下代码:
(into [] (range 3))
但是后来我看到使用了这段代码:
(apply vector (range 3))
这两个代码示例之间有什么区别?一个比另一个更惯用吗?何时使用 into 来初始化集合,何时使用 apply + factory 函数?
你调用它们的方式,两个函数的结果是相同的。但是,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))
最后但并非最不重要的一点是,两次调用的内存占用和性能可能存在差异,但它们在很大程度上取决于您的环境,如果您担心这一点,我建议您使用探查器。