gpt4 book ai didi

Clojure thread-first 宏 (->) 与 thread-last 宏 (->>) 有什么实际区别?

转载 作者:行者123 更新时间:2023-12-04 16:25:21 28 4
gpt4 key购买 nike

我还没有完全理解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

这些差异的实际含义是什么?我知道在 map 和字典上使用威胁优先 -> 是有意义的,其中每个转换都会创建原始实例的新副本,必须为下一次操作提供该副本。但是,在许多情况下,这两个运算符的行为实际上是相同的:

(->> [2 5 4 1 3 6] (reverse) (rest) (sort) (count)) ;; => 5
(-> [2 5 4 1 3 6] (reverse) (rest) (sort) (count)) ;; => 5

最佳答案

实际的区别在于宏将变量(以及后续结果)“插入”到表达式中:

(ns so.example)

(defn example-1 [s]
(-> s
(str "foo")))

(defn example-2 [s]
(->> s
(str "foo")))

(example-1 "bar")
;=> "barfoo"

(example-2 "bar")
;=> "foobar"

所以 (-> "bar"(str "foo"))(str "bar""foo")(->> "b​​ar"(str "foo"))(str "foo""bar") 相同。使用一元函数 ->->> 做同样的事情。

当您需要更大的灵 active 来确定这些结果应该插入的位置时,您可以使用 as->:

(ns so.example)

(defn example-3 [s]
(as-> s v
(str "foo" v "foo")))

(example-3 "bar")
;=> "foobarfoo"

关于Clojure thread-first 宏 (->) 与 thread-last 宏 (->>) 有什么实际区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65629918/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com