2014-09-20 16 views

Trả lời

28

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-somethingdo-something-additionally được thực thi.

+1

Đ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

+0

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

5

Sử dụng if khi bạn có hai cụm từ khác nhau: cho mệnh đề true và cho mệnh đề false.

whenwhen-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ặc false trong trường hợp when-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 falsenil, khi cả hai đánh giá để false trong bối cảnh logic.

+0

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

+0

@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

+0

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

Các vấn đề liên quan