是否可以删除let语句/避免以下代码中的中间'x'?:
(let [x (f a)]
(when (pred? x) x))
我在以下用例中遇到了这个问题:
(let [coll (get-collection-somewhere)]
(when (every? some? coll) ; if the collection doesn't contain nil values
(remove true? coll))) ; remove all true values
因此,如果集合没有nil值,则只保留非真值,例如数字,字符串或其他值。
所以,我正在寻找这样的东西:
(defn pass-if-true [x pred?]
(when (pred? x) x))
答案 0 :(得分:1)
假设您不想定义pass-if-true
函数,您可以做的最好的是匿名函数:
(#(when (every? some? %)
(remove true? %))
(get-collection-somewhere))
您还可以将谓词和转换提取到参数中:
(#(when (%1 %3) (%2 %3))
(partial every? some?)
(partial remove true?)
(get-collection-somewhere))
答案 1 :(得分:1)
(f a)
表单是防止收集构建功能运行两次所必需的:
(get-collection-somewhere)
或let
这是一个典型的习语,你正确地做到了。
当然,如果您已经拥有该集合并且未在此表达式中构建,则您不需要when-let
。
但是,您可能希望看到 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(peopleInMunicipality, $person, $person.surname == %@).@count > 0", @"Smith"];
:
https://clojuredocs.org/clojure.core/when-let
在某些情况下可以节省一些按键,但这不是其中之一。