【发布时间】:2021-01-08 13:29:36
【问题描述】:
我仍然不完全理解这两个 Clojure 箭头宏 thread-first -> 和 thread-last 宏 ->> 之间的区别。
在阅读https://clojure.org/guides/threading_macros 时,我了解到线程优先 -> 是针对单个对象的嵌套操作的替代表达式,每个数据步都使用该对象作为输入参数,执行独立的操作。
(defn transformation [object]
(transform2 (transform1 object)))
变成
(defn transformation [object]
(-> object
(transform1) ;; object as implicit argument
(transform2))) ;; object as implicit argument
当使用threat-last ->> 运算符时,每个转换都使用前面转换的输出作为隐式参数:
(defn transformation [object]
(->> object
(transform1) ;; object as implicit argument
(transform2))) ;; (transform1 object) as implicit argument
这些差异的实际含义是什么?我知道将威胁 -first -> 用于地图和字典上的操作是有意义的,其中每个转换都会创建原始实例的新副本,必须为下一次操作提供该副本。
但是,在许多情况下,这两个运算符的行为实际上是相同的:
(->> [2 5 4 1 3 6] (reverse) (rest) (sort) (count)) ;; => 5
(-> [2 5 4 1 3 6] (reverse) (rest) (sort) (count)) ;; => 5
【问题讨论】:
-
Stuart Sierra 有一篇名为 threading with style 的帖子,对线程宏的使用有很好的指导。
标签: clojure