2014-09-20 52 views

回答

28

使用if當你有一個真正的和一個虛假的情況下,你不需要一個隱含的do塊。相比之下,當你只需要處理truthy case和隱含的do時,應該使用when。速度沒有區別,這是使用最習慣風格的問題。

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

if情況下,僅do-something如果​​返回truthy結果,而在when情況下,兩個do-somethingdo-something-additionally執行將會運行。

+1

如果我只需要處理真實情況,並且不需要隱式'do',那麼在這種情況下使用更傳統? – damonh 2017-02-13 13:52:13

+0

使用'when'。 'do'部分是另一個很好的理由,可以在'if'之後選擇'when',而不是必要的先決條件。 – schaueho 2017-02-18 13:32:16

5

當您有兩個不同的表達式時使用if:對於true子句和對於false子句。

whenwhen-not在兩種情況下是有用的:

  • 當你想執行一個或多個(隱do幫助這裏)非純操作條件;
  • 當您想評估某些謂詞評估值爲true(或false如果是when-not),並在相反的情況下返回nil

唯一的區別是虛假的回報或無

falsenil之間沒有太大的區別,因爲這兩種評估在邏輯上下文false

+0

我注意到在Clojure和Common Lisp中使用'when'時的風格差異。在CL中,如果您在測試失敗時關心返回值,有些人認爲使用'when'時是不好的;在這種情況下,你應該在'if'的最後一個語句中顯式返回'nil'。在Clojure中,在相同的情況下使用'when'是很常見的,因爲大多數代碼在Clojure中是純粹的功能:返回值很少被忽略。如果Clojure程序員遵循CL約定,那麼'when'很少用於純函數代碼。 (偶爾'nil'與'false'有關係。) – Mars 2014-09-21 05:55:05

+0

@Mars,有趣的是,Clojure中'false'和'nil'共存的真正原因是什麼?當'false'可以做'nil'不能做的事時,我可以想到沒有任何情況。 – Mark 2014-09-21 07:28:25

+0

我認爲總體思路是:'nil'意思是「序列中沒有剩下任何東西」,而'false'只意味着假。 'nil'也意味着錯誤的事實允許簡單地測試序列的結束。另外,你可以做一些事情,比如'(get {:a 1:b nil}:c false)'。更多討論[這裏](http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-broken),[here](http:/ /stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-scheme),[here](http://www.lispcast.com/ nil-punning)和[here](http://clojure.org/lazy)。 – Mars 2014-09-22 05:23:56