2009-10-22 27 views

回答

9

比較:

user> (:baz (:bar (:foo {:foo {:bar {:baz 123}}}))) 
123 
user> (java.io.BufferedReader. (java.io.FileReader. "foo.txt")) 
#<BufferedReader [email protected]> 
user> (vec (reverse (.split (.replaceAll (.toLowerCase "FOO,BAR,BAZ") "b" "x") ","))) 
["xaz" "xar" "foo"] 

到:當你想要一個簡潔的方式嵌套調用

user> (-> {:foo {:bar {:baz 123}}} :foo :bar :baz) 
123 
user> (-> "foo.txt" java.io.FileReader. java.io.BufferedReader.) 
#<BufferedReader [email protected]> 
user> (-> "FOO,BAR,BAZ" .toLowerCase (.replaceAll "b" "x") (.split ",") reverse vec) 
["xaz" "xar" "foo"] 

->使用。它可以讓你按照他們將被調用的順序列出調用,而不是內部調出,這可以更具可讀性。在第三個例子中,注意一些參數與它們所屬的函數之間有多少距離; ->可讓您將參數和函數調用分組更清晰。因爲它是一個宏,它也適用於Java調用,這很好。

->不是那麼強大,它只是時不時地爲你節省幾個parens。是否使用它是風格和可讀性的問題。

查看clojure.zip的底部,瞭解如何有用的極端示例。

(-> dz next next next next next next next next next remove up (append-child 'e) root) 
5

wiki兩者我總是發現這個例子中令人印象深刻:

user=> (import '(java.net URL) '(java.util.zip ZipInputStream)) 
user=> (-> "http://clojure.googlecode.com/files/clojure_20081217.zip" 
      URL. .openStream ZipInputStream. .getNextEntry bean :name) 

正如布賴恩說 - 它不是「有用」這麼多的不同的風格。「我發現所有Java互操作這種形式的Y和Z的「開始X」然後做......做比Z到ŸX的可讀性更強

基本上,你有4個選項:

; imperative style named steps: 
(let [X something 
     b (Y X) 
     c (Z b)] c) 

; nested calls 
(Z (Y X)) 

; threaded calls 
(-> X Y Z) 

; functional composition 
((comp Z Y) X) 

我找到 - >真的很適合Java互操作,但在其他地方避免它。從#clojure

2
(defn search-tickets-for [term] 
    (-> term search zip-soup first :content 
    ((partial filter #(= :body (:tag %)))) first :content 
    ((partial filter #(= :div (:tag %)))) 
    ((partial filter #(= "content" ((comp :id :attrs) %)))) 
    ((partial map :content)) first ((partial map :content)) 
    ((partial map first)) ((partial filter #(= :ul (:tag %)))) first :content 
    ((partial map :content)) 
    ((partial map first)) 
    ((partial mapcat :content)) 
    ((partial filter #(= :h4 (:tag %)))) 
    ((partial mapcat :content)) 
    ((partial filter #(= :a (:tag %)))) 
    ((partial mapcat :content)))) 

clojurebot使用這個搜索assembla門票

相關問題