Wann ist einer besser als der andere? Ist einer schneller als der andere oder ist der einzige Unterschied die Rückkehr von false oder nil?Wann "if" und "wann" in Clojure verwenden?
Antwort
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.
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
(oderfalse
im Fallwhen-not
) auswertet, und im umgekehrten Fallnil
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.
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
@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
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
- 1. Wann 'if ... else if' und wann zu verwenden ist
- 2. Wann zu verwenden, im Vergleich zu If-Let in Clojure
- 3. Wann System() verwenden und wann execv *() verwenden?
- 4. Wann node.js verwenden und wann Ajax verwenden?
- 5. Luftstrom: Wann SellerieExecutor und wann MesosExecutor verwenden
- 6. Wann und wann nicht CoreAnimation verwenden
- 7. Wann Datenbankansichten verwenden und wann nicht?
- 8. Wann zu verwenden und wann nicht Python 3.5 `erwarten 'verwenden?
- 9. Wann socket.io zu verwenden und wann Ajax zu verwenden
- 10. Wann verwenden wir POJO und wann verwenden wir SLSB
- 11. Wann verwenden Sie Eigenschaften und wann in Java?
- 12. Wann Vektoren und wann Arrays in C++ verwenden?
- 13. Wann zu verwenden und wann importieren in Aurelia?
- 14. Wann undef_method und wann remove_method?
- 15. Wann sollten Sie mit "if" nach Fehlern suchen und wann sollten Sie Ausnahmen verwenden?
- 16. Wann/proc und wann/dev
- 17. Wann sollte ich den Deftype in Clojure verwenden?
- 18. Wann ng-if trigerd sind?
- 19. Wann MVC und EZB verwenden?
- 20. Wann sollte ich `seq` in Clojure vermeiden?
- 21. Wann SoapObject und SoapPrimitive verwenden
- 22. Was und wann Tuple verwenden?
- 23. Wann verlinken und wann einbeziehen?
- 24. Wann IEquatable verwenden und warum
- 25. Wann concat verwenden und anhängen?
- 26. Wann sollte ich async verwenden/abwarten und wann nicht?
- 27. Wann zu verwenden behalten und wann zu kopieren
- 28. Wann sollte Lehre ORM und wann Zend-db-Tabelle verwenden?
- 29. Wann sollte ich lineare neuronale Netze verwenden und wann nichtlinear?
- 30. Wann GWT zu verwenden ist und wann nicht
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
Verwenden Sie 'wenn'. Der "do" -Teil ist ein zusätzlicher guter Grund, "wenn" über "wenn" zu bevorzugen, keine notwendige Voraussetzung. – schaueho