Quando uno è migliore dell'altro? Uno è più veloce dell'altro o l'unica differenza è il ritorno di false o nil?Quando usare "se" e "quando" in Clojure?
risposta
Utilizzare if
quando si dispone esattamente di un caso attendibile e uno falso e non è necessario un blocco implicito do
. Al contrario, è necessario utilizzare when
quando si deve gestire solo il caso attendibile e l'implicito do
. Non c'è differenza di velocità, si tratta di usare lo stile più idiomatico.
(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))
Nel caso if
, verrà attivato solo se do-something
my-predicate?
restituisce un risultato truthy, mentre nel caso when
, vengono eseguiti sia do-something
e do-something-additionally
.
Utilizzare if
quando si hanno due espressioni diverse: per la clausola true
e per la clausola false
.
when
e when-not
sono utili in due casi:
- quando si desidera eseguire uno o più (implicita
do
aiuta qui) operazioni non puri condizionale; - quando si desidera valutare qualcosa quando alcuni predicati restituiscono
true
(ofalse
in caso diwhen-not
) e restituiscononil
in caso contrario.
unica differenza è il ritorno di falso o nullo
Non v'è alcuna differenza principale fra false
e nil
, come sia evaluate per false
nel contesto logico.
Ho notato una differenza stilistica nell'uso di 'when' in Clojure e Common Lisp. In CL, alcune persone considerano male usare 'when' se ci si preoccupa del valore restituito quando il test fallisce; in tal caso dovresti restituire esplicitamente 'nil' nell'ultima clausola di un' if'. È logico che sia comune usare 'when' in Clojure nella stessa situazione, poiché la maggior parte del codice è puramente funzionale in Clojure: i valori di ritorno sono raramente ignorati. Se i programmatori Clojure seguivano la convenzione CL, 'when' veniva usato raramente in un codice puramente funzionale. (Occasionalmente 'nil' contro' false' importa.) – Mars
@Mars, è interessante, esiste una vera ragione per la coesistenza di 'false' e' nil' in Clojure? Non riesco a pensare a nessuna situazione in cui 'false' potrebbe fare qualcosa che' nil' non potrebbe fare. – Mark
Penso che l'idea generale sia: "nil" significa "non c'è più niente nella sequenza", mentre "false" significa semplicemente falso. Il fatto che 'nil' significhi anche false permette di testare semplicemente la fine di una sequenza. Inoltre, puoi fare cose come '(ottieni {: a 1: b nil}: c false)'. Altre discussioni [qui] (http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-broken), [qui] (http://stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-scheme), [qui] (http://www.lispcast.com/ nil-punning), e [qui] (http://clojure.org/lazy). – Mars
- 1. Quando dovrei usare deftype in Clojure?
- 2. Quando usare viewDidLoad e quando usare awakeFromNib
- 3. Quando usare node.js e quando usare ajax?
- 4. quando usare Task e quando usare Thread?
- 5. Quando usare undef_method e quando usare remove_method?
- 6. Quando usare Requirejs e quando usare javascript in bundle?
- 7. Quando usare richiede e quando usare l'importazione in Aurelia?
- 8. Quando usare dup e quando usare clone in Ruby?
- 9. Quando usare set -e
- 10. Quando utilizzare socket.io e quando usare ajax
- 11. Quando dovrei usare setUpClass e quando __init__?
- 12. Quando usare .mdf e quando .sdf?
- 13. C# Quando dovrei usare List e quando dovrei usare l'arraylist?
- 14. Quando dovrei usare require() e quando usare define()?
- 15. Quando usare LEFT JOIN e quando usare INNER JOIN?
- 16. Quando (se necessario) dovrei usare Bitmap.recycle()?
- 17. Quando si dovrebbe usare .innerHTML e quando document.write in JavaScript
- 18. Rails Observers - Quando e quando non usare osservatori in Rails
- 19. Quando usare @Embedded e @Embeddable?
- 20. Perché e quando usare __noop?
- 21. Come usare e quando è utile usare memmove in C?
- 22. Quando dovremmo usare la classe e quando non dovremmo
- 23. Quando e come usare Tornado? Quando è inutile?
- 24. quando è intelligente usare bindService e quando startService
- 25. Quando dovrei usare AutoMapper e quando non lo sono
- 26. Quando usare 'sé' in Ruby
- 27. Quando dovrei usare async/await e quando no?
- 28. Quando uso fabs e quando è sufficiente usare std :: abs?
- 29. Jquery - Quando utilizzare "this" e quando usare "$ (this)"?
- 30. SPL vs. Array: quando dovremmo usare SPL e quando dovremmo usare l'array in PHP?
Cosa succede se devo solo gestire il caso vero e non è necessario alcun 'do' implicito, che è più convenzionale da usare in questo caso? – damonh
Usa 'quando'. La parte 'do' è un'ulteriore buona ragione per preferire' when' su 'if', non una precondizione necessaria. – schaueho