2014-09-20 20 views

risposta

28

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-somethingmy-predicate? restituisce un risultato truthy, mentre nel caso when, vengono eseguiti sia do-something e do-something-additionally.

+1

Cosa succede se devo solo gestire il caso vero e non è necessario alcun 'do' implicito, che è più convenzionale da usare in questo caso? – damonh

+0

Usa 'quando'. La parte 'do' è un'ulteriore buona ragione per preferire' when' su 'if', non una precondizione necessaria. – schaueho

5

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 (o false in caso di when-not) e restituiscono nil 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.

+0

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

+0

@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

+0

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

Problemi correlati