考虑以下代码:
(if-let [x (a-function)]
(do-something-with x) ;; (a-function) returned a truthy result
(do-something-else) ;; (a-function) returned nil or false
这就像let
,在 thatx
中将绑定到 的返回值(a-function)
。这个函数可以返回nil
或false
。在这种情况下,隐式测试失败(do-something-else)
并将被评估。如果x
is notnil
和 not false
,(do-something-with x)
将被评估。
这可能有用的场景:
(if-let [user (find-logged-in-user)]
(do something with logged in user) ;; a user was found
(redirect to login page) ;; no user was found
我有时使用类似下面的东西,有条件地将键添加到选项映射中:
(apply merge {:username "joe"
:email "joe@example.com"}
(when-let [name (find-full-name)] {:name name})
(when-let [dob (find-date-of-birth)] {:dob dob}))
这会产生一个带有:username
和:email
键的映射,:name
如果找到用户的全名,则生成一个:dob
键,如果找到了出生日期,则再加上一个键。
我希望这使得使用if-let
和when-let
更清晰。