2015-08-23 65 views

回答

7

线程优先(->)和线程最后(->>)在那里使代码更具可读性。但这已经很重要了!

它允许非嵌套函数调用(例如,从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 (...(... {...}))) 

在第一个示例中,非常清楚您从地图开始,然后对其执行操作。第二,很显然你数了一些东西。

首选项取决于您想要提出的内容。

另外,-> vs ->>的选择是一个清晰的视觉指标:您是否在运营或不运营集合?这是显而易见的(这是Clojure的一个约定,将集合作为最后一个参数)。

所以是的,它是“唯一”的可读性,但这是构建程序非常重要的一部分,Clojure为您提供了自然地读取代码的工具。在选择一种解决方案时,我会尝试考虑the way Clojure will be read

+2

还值得注意的是,有一系列相关的条件线程宏,它们会在其上添加额外的功能。 'some->'和'some - >>'线程首先和最后一个如上,但是如果任何步骤返回'nil',一个la可能是monad,则停止评估。 'cond->'和'cond - >>'测试一个条件来决定是否通过每个线程表单传递值。 – Magos

+1

@nha谢谢,现在很清楚!顺便说一个新问题出现在我看到你的不错答案:做方法名称前的点表明java方法? (在'.replace''.toUpperCase'),并且在调用java方法和clojure库之间有什么区别或者好处:'(clojure.string/replace)''(clojure.string/upper-case)'? – amirteymuri

+0

@AmirTeymuri很高兴你喜欢它:)是的,这些都是Java方法(我只是从clojuredocs中拿出了这个例子,但是是的,Clojure方法更具惯用性)。另外,当调用不在Clojure命名空间中的Java方法时,您可能会对'doto'宏感兴趣。 – nha

相关问题