Khi nào sử dụng if-let
thay vì let
làm cho mã trông đẹp hơn và có ảnh hưởng gì đến hiệu suất không?Khi nào sử dụng let và if-let trong Clojure
Trả lời
Tôi đoán if-let nên được sử dụng khi bạn muốn tham khảo giá trị một if
tình trạng của trong "then
" một phần của mã:
tức là thay vì
(let [result :foo]
(if result
(do-something-with result)
(do-something-else)))
bạn viết:
(if-let [result :foo]
(do-something-with result)
(do-something-else))
đó là một chút neater, và giúp bạn thụt lề một cấp độ hơn nữa. Theo như hiệu quả đi, bạn có thể thấy rằng việc mở rộng vĩ mô không thêm nhiều chi phí:
(clojure.core/let [temp__4804__auto__ :foo]
(if temp__4804__auto__
(clojure.core/let [result temp__4804__auto__]
(do-something-with result))
(do-something-else)))
này cũng cho thấy việc các ràng buộc không thể được đề cập trong "else
" một phần của mã.
Trường hợp sử dụng tốt cho if-let
là loại bỏ nhu cầu sử dụng anaphora. Ví dụ, ngôn ngữ lập trình Arc cung cấp một macro được gọi là aif
cho phép bạn liên kết một biến đặc biệt có tên là it
bên trong phần thân của một biểu mẫu if
khi một biểu thức nhất định đánh giá đúng logic. Chúng ta có thể tạo ra những điều tương tự trong Clojure:
(defmacro aif [expr & body]
`(let [~'it ~expr] (if ~'it (do [email protected]))))
(aif 42 (println it))
; 42
Điều này là tốt và tốt, ngoại trừ Anaphora mà không làm tổ, nhưng if-let
làm:
(aif 42 (aif 38 [it it]))
;=> [38 38]
(aif 42 [it (aif 38 it)])
;=> [42 38]
(if-let [x 42] (if-let [y 38] [x y]))
;=> [42 38]
Tìm thấy rất hữu ích. – octopusgrabbus
- 1. let vs def in clojure
- 2. clojure - giải quyết một biểu tượng bên trong let
- 3. Khi nào sử dụng các biến cá thể có lợi thế hơn việc sử dụng let()?
- 4. Sử dụng bảo vệ trong let .. trong các biểu thức
- 5. Tại sao ocaml cần cả "let" và "let rec"?
- 6. Rails - RSpec - Sự khác biệt giữa "let" và "let!"
- 7. Làm thế nào để `let` được thực hiện trong Clojure và chi phí của nó là gì?
- 8. let vs letfn để xác định các hàm cục bộ trong clojure?
- 9. Clojure: Tại sao if-let chỉ cho phép 2 biểu mẫu trong vector ràng buộc?
- 10. Bối rối bởi sự khác biệt giữa let và let * trong Đề án
- 11. Sự khác biệt giữa: while và: khi nào trong clojure?
- 12. Khi nào cần sử dụng giao diện và khi nào cần sử dụng các chức năng bậc cao hơn?
- 13. Clustering (fkmeans) với Mahout sử dụng Clojure
- 14. Tôi làm cách nào để sử dụng Zip trong Clojure?
- 15. Khi nào sử dụng "mới" và khi nào không sử dụng, trong C++?
- 16. Kỹ thuật băm nào sử dụng khi xây dựng bộ lọc nở trong clojure?
- 17. Trong Clojure tại sao sử dụng: chỉ []
- 18. Clojure Trong khi Loop
- 19. Tại sao tôi nên sử dụng 'áp dụng' trong Clojure?
- 20. Khi nào sử dụng `liên tục` trong clojure, các đối số của nó được đánh giá như thế nào và khi nào?
- 21. Khi nào sử dụng, không sử dụng, OneToOne và ManyToOne
- 22. Độ tinh khiết chức năng bằng cách sử dụng 'let' trong Haskell
- 23. Tạo và sử dụng thư viện trong cả Clojure và ClojureScript
- 24. BitmapCache? Khi nào và cách sử dụng?
- 25. Khi nào sử dụng HtmlControls và WebControls
- 26. Khi nào sử dụng TaskEx.Run và TaskEx.RunEx
- 27. Khi nào sử dụng Soapobject và SoapPrimitive
- 28. Khi nào sử dụng Runtime.maxMemory() và totalMemory()
- 29. Enums và Constants. Sử dụng khi nào?
- 30. = và == trong Clojure
Ngoài ra, nó không thể có nhiều hơn 2 các dạng trong vector liên kết của if-let. Ví dụ: (nếu cho [a 20 b nil] (println a)) - không hoạt động! –
Ngoài ra còn có 'khi-let'. –