Clojure中的->
和->>
宏之间有什么区别?
答案 0 :(得分:70)
通常,当函数对单个主题起作用时,该主题是第一个参数(例如,conj
,assoc
)。当函数对序列主题起作用时,该主题是最后一个参数(例如,map
,filter
)。
因此,->
和->>
被记录为分别对第一个和最后一个参数进行线程化,但将它们视为分别应用于单个或顺序参数也很有用。
例如,我们可以将向量视为单个对象:
(-> [1 2 3]
(conj 4) ; (conj [1 2 3] 4)
(conj 5) ; (conj [1 2 3 4] 5)
(assoc 0 0)) ; (assoc [1 2 3 4 5] 0 0)
=> [0 2 3 4 5]
或者我们可以将其视为一个序列:
(->> [1 2 3]
(map inc) ; (map inc [1 2 3])
(map inc) ; (map inc (2 3 4))
(concat [0 2])) ; (concat [0 2] (3 4 5))
=> (0 2 3 4 5)