Frage

Es scheint ein leistungsfähiges Makro zu sein, aber ich versagt es aber dumme Beispiele zu etwas zu übernehmen. Können Sie mir einigen echten Gebrauch davon zeigen?

Danke!

War es hilfreich?

Lösung

vergleichen:

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

zu:

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

-> verwendet, wenn Sie einen kurzen Weg zum Nest Anrufen wollen. Damit können Sie die Anrufliste in der Reihenfolge werden sie eher als inside-out genannt werden, die besser lesbar sein. Im dritten Beispiel feststellen, wie viel Abstand zwischen einigen der Argumente ist und die Funktion sie gehören; -> können Sie Gruppen Argumente und Funktion ruft ein bisschen sauberer. Weil es ein Makro funktioniert es auch für Java nennt, das ist schön.

-> ist nicht so stark, es spart Ihnen nur ein paar Pars von Zeit zu Zeit. Unter Verwendung ist oder nicht eine Frage des Stils und Lesbarkeit.

Schauen Sie unten auf clojure.zip für extreme Beispiele, wie dies hilfreich ist.

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

Andere Tipps

Genommen von der Wiki Ich habe immer gefunden dieses Beispiel eindrucksvoll:

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

Wie Brian gesagt hat - es ist nicht ‚nützlich‘ so viel wie ‚andere Art‘. Ich finde für alle Java-Interop diese Form von ‚mit X beginnen‘, dann tun Y und Z ... besser lesbar als tun Z bis Y von X.

Grundsätzlich haben Sie 4 Optionen:

; 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)

Ich finde -> wirklich für Java scheint Interop aber vermeiden es anderswo

.
(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 von #clojure verwendet diese Assembla Karten

suchen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top