什麼時候比另一個好? 其中一個比另一個更快還是唯一的區別是返回false或nil?什麼時候在Clojure中使用「if」和「when」?
回答
使用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-something
和do-something-additionally
執行將會運行。
當您有兩個不同的表達式時使用if
:對於true
子句和對於false
子句。
when
和when-not
在兩種情況下是有用的:
- 當你想執行一個或多個(隱
do
幫助這裏)非純操作條件; - 當您想評估某些謂詞評估值爲
true
(或false
如果是when-not
),並在相反的情況下返回nil
。
唯一的區別是虛假的回報或無
有false
和nil
之間沒有太大的區別,因爲這兩種評估在邏輯上下文false
。
我注意到在Clojure和Common Lisp中使用'when'時的風格差異。在CL中,如果您在測試失敗時關心返回值,有些人認爲使用'when'時是不好的;在這種情況下,你應該在'if'的最後一個語句中顯式返回'nil'。在Clojure中,在相同的情況下使用'when'是很常見的,因爲大多數代碼在Clojure中是純粹的功能:返回值很少被忽略。如果Clojure程序員遵循CL約定,那麼'when'很少用於純函數代碼。 (偶爾'nil'與'false'有關係。) – Mars 2014-09-21 05:55:05
@Mars,有趣的是,Clojure中'false'和'nil'共存的真正原因是什麼?當'false'可以做'nil'不能做的事時,我可以想到沒有任何情況。 – Mark 2014-09-21 07:28:25
我認爲總體思路是:'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
- 1. 什麼時候在SAS中使用IF或%IF
- 2. 什麼時候使用__proto__和什麼時候使用原型
- 3. 什麼時候使用Ruby和什麼時候使用PHP
- 4. 什麼時候應該在Clojure中使用deftype?
- 5. 什麼時候應該避免在Clojure中使用`seq`?
- 6. 什麼時候使用for-each和什麼時候在xslt中使用apply-templates?
- 7. Clojure的生日是什麼時候?
- 8. 什麼時候和爲什麼我會在C++中使用abs
- 9. 什麼時候應該使用AWS,什麼時候不使用
- 10. intn_t什麼時候使用它,什麼時候不使用
- 11. 什麼時候使用信號和插槽,什麼時候不使用
- 12. 什麼時候使用適配器和什麼時候使用inflater
- 13. 什麼時候使用if else else或python中的elif
- 14. 什麼時候在Django中使用「AbstractBaseUser」?
- 15. 什麼時候在.NET中使用GC.Collect()?
- 16. 什麼時候在mysql中使用OPTIMIZE
- 17. 什麼時候在hibernate中使用Criteria.ALIAS_TO_ENTITY_MAP?
- 18. 什麼時候在Java中使用「this」
- 19. 什麼時候在C++中使用「declare」?
- 20. 什麼時候評估ng-if?
- 21. 你什麼時候使用getGraphObject和getGraphEdge
- 22. 什麼時候使用express.use,express.get和express.post
- 23. 什麼時候使用.val()和.innerHTML?
- 24. PostgreSQL,CASE WHEN和IF
- 25. 什麼時候使用uncaught_exception?
- 26. 什麼時候使用vtable?
- 27. 什麼時候使用sIFR?
- 28. JOINS什麼時候使用?
- 29. 什麼時候使用Dispose
- 30. 什麼時候使用ANTLR
如果我只需要處理真實情況,並且不需要隱式'do',那麼在這種情況下使用更傳統? – damonh 2017-02-13 13:52:13
使用'when'。 'do'部分是另一個很好的理由,可以在'if'之後選擇'when',而不是必要的先決條件。 – schaueho 2017-02-18 13:32:16