Khi nào thì tốt hơn loại kia? Có nhanh hơn cái kia hay khác biệt duy nhất là sự trả về sai hay không?Khi nào nên sử dụng "if" và "when" trong Clojure?
Trả lời
Sử dụng if
khi bạn có chính xác một trường hợp sai và trung thực và bạn không cần khối ẩn do
. Ngược lại, when
nên được sử dụng khi bạn chỉ phải xử lý trường hợp trung thực và ngụ ý do
. Không có sự khác biệt về tốc độ, đó là vấn đề sử dụng phong cách thành ngữ nhất.
(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))
Trong trường hợp if
, chỉ do-something
sẽ được chạy nếu my-predicate?
trả về một kết quả truthy, trong khi trong trường hợp when
, cả do-something
và do-something-additionally
được thực thi.
Sử dụng if
khi bạn có hai cụm từ khác nhau: cho mệnh đề true
và cho mệnh đề false
.
when
và when-not
rất hữu ích trong hai trường hợp:
- khi bạn muốn thực hiện một hoặc một số (implicit
do
giúp ở đây) hoạt động không thuần túy có điều kiện; - khi bạn muốn đánh giá điều gì đó khi một số biến vị ngữ đánh giá thành
true
(hoặcfalse
trong trường hợpwhen-not
) và trả vềnil
trong trường hợp ngược lại.
chỉ khác biệt là sự trở lại của sai hoặc nil
Không có sự khác biệt lớn giữa false
và nil
, khi cả hai đánh giá để false
trong bối cảnh logic.
Tôi đã nhận thấy sự khác biệt về phong cách khi sử dụng 'when' trong Clojure và Common Lisp. Trong CL, một số người coi nó là xấu khi sử dụng 'khi' nếu bạn quan tâm đến giá trị trả về khi kiểm tra thất bại; trong trường hợp đó, bạn nên trả về 'nil' trong mệnh đề cuối cùng của' if'. Nó có ý nghĩa rằng nó phổ biến để sử dụng 'khi' trong Clojure trong tình hình tương tự, vì hầu hết các mã là hoàn toàn chức năng trong Clojure: trả về giá trị hiếm khi bị bỏ qua. Nếu các lập trình viên Clojure theo quy ước CL, 'when' hiếm khi được sử dụng trong mã thuần túy. (Đôi khi 'nil' so với' false'.) – Mars
@Mars, thật thú vị, có lý do thực sự nào cho sự tồn tại của 'false' và' nil' trong Clojure không? Tôi có thể nghĩ không có tình huống khi 'sai' có thể làm điều gì đó mà' không thể. – Mark
Tôi nghĩ ý tưởng chung là: 'nil' có nghĩa là" không có gì còn lại trong chuỗi ", trong khi' false' chỉ có nghĩa là sai. Thực tế là 'nil' cũng có nghĩa là sai cho phép thử nghiệm cho sự kết thúc của một chuỗi đơn giản. Ngoài ra, bạn có thể làm những việc như '(get {: a 1: b nil}: c false)'. Thảo luận thêm [tại đây] (http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-broken), [tại đây] (http://stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-scheme), [tại đây] (http://www.lispcast.com/ nil-punning), và [ở đây] (http://clojure.org/lazy). – Mars
- 1. Khi nào sử dụng let và if-let trong Clojure
- 2. Khi nào bạn nên sử dụng JCR và khi nào bạn nên sử dụng JPA/RDBMS?
- 3. Khi nào nên sử dụng hệ thống() và khi nào nên sử dụng execv *()?
- 4. Khi nào tôi nên sử dụng require() và khi nào nên sử dụng define()?
- 5. Tại sao tôi nên sử dụng 'áp dụng' trong Clojure?
- 6. Khi nào sử dụng 'Array.prototype' và khi nào nên sử dụng 'this' trong JavaScript?
- 7. Khi nào tôi nên sử dụng stdClass và khi nào tôi nên sử dụng một mảng trong mã php oo?
- 8. Trong Jira Agile khi nào tôi nên sử dụng "Story" và khi nào tôi nên sử dụng "Cải tiến"
- 9. Khi nào tôi nên sử dụng AutoMapper và khi không
- 10. readValue và readTree ở Jackson: khi nào nên sử dụng?
- 11. Khi nào tôi nên sử dụng setUpClass và khi __init__?
- 12. JQuery hoãn lại. Sử dụng $ .when và .progress()
- 13. Khi nào nên sử dụng và khi nào không sử dụng Try Catch Cuối cùng
- 14. Khi nào nên sử dụng các lớp nào trong Qt Quick 2 và cách sử dụng?
- 15. PHP: Khi nào nên sử dụng Traits và khi nào nên sử dụng các phương thức tĩnh?
- 16. Khi sử dụng các API RESTful, khi nào bạn nên sử dụng RestSharp và khi HttpClient?
- 17. Khi nào nên sử dụng node.js và khi nào sử dụng ajax?
- 18. Khi nào nên sử dụng Class.isInstance() và khi nào thì sử dụng toán tử instanceof?
- 19. Khi nào chúng ta nên sử dụng mutex và khi nào chúng ta nên sử dụng semaphore
- 20. C# Khi nào tôi nên sử dụng Danh sách và khi nào tôi nên sử dụng danh sách array?
- 21. Khi nào tôi nên sử dụng Gói-Nhập khẩu và khi nào tôi nên sử dụng Yêu cầu-Gói?
- 22. Request.InputStream là gì và khi nào nên sử dụng?
- 23. Sự khác biệt giữa: while và: khi nào trong clojure?
- 24. Làm cách nào để sử dụng T-SQL's Case/When?
- 25. Khi nào nên sử dụng $ HTTP_POST_VARS ['field'] và $ _POST ['field']?
- 26. Khi nào tôi nên sử dụng perror ("...") và fprintf (stderr, "...")?
- 27. Khi nào tôi nên sử dụng React.cloneElement và this.props.children?
- 28. Khi nào và ở đâu tôi nên sử dụng WCF
- 29. Khi nào tôi nên sử dụng dấu và với scanf()
- 30. Khi nào bạn nên sử dụng IEnumerable và GetEnumerator?
Điều gì sẽ xảy ra nếu tôi chỉ phải xử lý đúng trường hợp và không có 'do' cần thiết, thông thường để sử dụng trong trường hợp này là gì? – damonh
Sử dụng 'khi'. Phần 'do' là một lý do bổ sung tốt để thích' khi' trên 'if', không phải là điều kiện tiên quyết cần thiết. – schaueho