2014-09-20 33 views

Antwort

28

Verwenden Sie if, wenn Sie genau einen truthy und einen falsy Fall haben und Sie keinen impliziten do Block benötigen. Im Gegensatz dazu sollte when verwendet werden, wenn Sie nur den truthy Fall und die implizite do behandeln müssen. Es gibt keinen Unterschied in der Geschwindigkeit, es ist eine Frage der Verwendung des idiomatischen Stils.

(if (my-predicate? my-data) 
    (do-something my-data) 
    (do-something-else my-data)) 

(when (my-predicate? my-data) 
    (do-something my-data) 
    (do-something-additionally my-data)) 

Im if Fall nur do-something wird ausgeführt werden, wenn my-predicate? ein truthy Ergebnis zurückgibt, während im when Fall beide do-something und do-something-additionally ausgeführt werden.

+1

Was ist, wenn ich nur den wahren Fall behandeln muss und kein implizites "do" benötigt wird, was in diesem Fall eher konventionell ist? – damonh

+0

Verwenden Sie 'wenn'. Der "do" -Teil ist ein zusätzlicher guter Grund, "wenn" über "wenn" zu bevorzugen, keine notwendige Voraussetzung. – schaueho

5

Verwenden Sie if, wenn Sie zwei verschiedene Ausdrücke haben: für true Klausel und für false Klausel.

when und when-not sind in zwei Fällen nützlich:

  • wenn Sie eine oder mehr durchführen möchten (impliziten do hilft hier) nicht-reine Operationen bedingt;
  • Wenn Sie etwas auswerten möchten, wenn ein Prädikat true (oder false im Fall when-not) auswertet, und im umgekehrten Fall nil zurückgeben.

einzige Unterschied ist die Rückgabe von false oder nil

zwischen false und nil, wie die beiden bewerten zu false in logischen Kontext keinen großen Unterschied ist.

+0

Ich habe einen stilistischen Unterschied in der Verwendung von 'When' in Clojure und Common Lisp bemerkt. In CL halten einige Leute es für schlecht, "wenn" zu verwenden, wenn Sie sich um den Rückgabewert kümmern, wenn der Test fehlschlägt. In diesem Fall sollten Sie in der letzten Klausel eines "if" explizit "nil" zurückgeben. Es macht Sinn, dass es üblich ist, 'when' in Clojure in derselben Situation zu verwenden, da der meiste Code in Clojure rein funktional ist: Rückgabewerte werden selten ignoriert. Wenn Clojure-Programmierer die CL-Konvention befolgten, würde "when" selten in rein funktionalem Code verwendet. (Gelegentlich 'nil' vs. 'false' ist wichtig.) – Mars

+0

@Mars, es ist interessant, gibt es einen wirklichen Grund für die Koexistenz von' false' und 'nil' in Clojure? Ich kann mir keine Situation vorstellen, in der "falsch" etwas tun könnte, was 'nil' nicht kann. – Mark

+0

Ich denke, die allgemeine Idee ist: 'nil' bedeutet" es ist nichts mehr in der Sequenz ", während' false' nur falsch bedeutet. Die Tatsache, dass "nil" auch "false" bedeutet, erlaubt es einfach, das Ende einer Sequenz zu testen. Sie können auch Dinge wie '(get {: a 1: b nil}: c false)' machen. Weitere Diskussion [hier] (http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-broken), [hier] (http://stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-scheme), [hier] (http://www.lispcast.com/ nicht-punning) und [hier] (http://clojure.org/lazy). – Mars

Verwandte Themen