2009-10-22 50 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门票

相关问题