Clojure 中的宏 -> ->
Macros -> ->> in Clojure
->
和 ->>
宏只是为了让代码更易读,还是它们还有其他特定功能?
线程优先 (->
) 和线程最后 (->>
) 是为了使代码更具可读性。但这已经很重要了!
它允许取消嵌套函数调用(示例取自 clojuredocs):
;; Arguably a bit cumbersome to read:
user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))
"X"
;; Perhaps easier to read:
user=> (-> "a b c d"
.toUpperCase
(.replace "A" "X")
(.split " ")
first)
它还可以让你把重点放在某件事上。例如,考虑:
(-> {... }
...
...
(count))
(count (...(... {...})))
在第一个示例中,很明显您从地图开始,然后对其进行操作。第二个,分明就是你在算东西。
偏好取决于你想提出什么。
此外,->
与 ->>
的选择是一个清晰的视觉指标:您是否在操作集合?这一点很明显(这是 Clojure 中的约定,将集合作为最后一个参数)。
所以是的,它是 "only" 可读性,但这是构建程序的一个非常重要的部分,Clojure 为您提供了使代码自然可读的工具。在选择一种解决方案时,我尽量考虑 the way Clojure will be read.
->
和 ->>
宏只是为了让代码更易读,还是它们还有其他特定功能?
线程优先 (->
) 和线程最后 (->>
) 是为了使代码更具可读性。但这已经很重要了!
它允许取消嵌套函数调用(示例取自 clojuredocs):
;; Arguably a bit cumbersome to read:
user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))
"X"
;; Perhaps easier to read:
user=> (-> "a b c d"
.toUpperCase
(.replace "A" "X")
(.split " ")
first)
它还可以让你把重点放在某件事上。例如,考虑:
(-> {... }
...
...
(count))
(count (...(... {...})))
在第一个示例中,很明显您从地图开始,然后对其进行操作。第二个,分明就是你在算东西。
偏好取决于你想提出什么。
此外,->
与 ->>
的选择是一个清晰的视觉指标:您是否在操作集合?这一点很明显(这是 Clojure 中的约定,将集合作为最后一个参数)。
所以是的,它是 "only" 可读性,但这是构建程序的一个非常重要的部分,Clojure 为您提供了使代码自然可读的工具。在选择一种解决方案时,我尽量考虑 the way Clojure will be read.