例如,
> (some #{nil} #{nil 1 2 3})
nil
> (some #{} #{nil 1 2 3})
nil
我知道我可以使用
(some nil? #{nil 1 2 3})
检查零值。目前我想不出任何好的例子。
但是一般情况下,当返回 nil 时,如何判断 nil 是什么都没有找到还是 nil 的值被找到呢?
例如,
> (some #{nil} #{nil 1 2 3})
nil
> (some #{} #{nil 1 2 3})
nil
我知道我可以使用
(some nil? #{nil 1 2 3})
检查零值。目前我想不出任何好的例子。
但是一般情况下,当返回 nil 时,如何判断 nil 是什么都没有找到还是 nil 的值被找到呢?
nil
只是一个值,其含义取决于上下文。
它就像这方面的所有其他值一样:唯一需要注意的是它是,即在条件表达式中falsy
算作。false
需要注意的三个特殊情况:
nil
是用于指示空序列的返回值,例如在(seq [])
nil
通常用作返回值来表示假,例如在(or false nil)
nil
当映射查找找不到给定键时默认返回,例如在({:a 1} :b)
这些情况有时会引起歧义:如果是这样,那么您需要使用不同的功能。你的例子是一个很好的例子:
(some #{nil} #{1 2 3})
=> nil
(失败 - 未找到结果)(some #{nil} #{nil 1 2 3})
=> nil
(成功 - 没有找到结果!!!)在这种情况下,您只是选择了错误的函数:您不能使用 set#{nil}
来检测 nils.... 相反,您可以使用nil?
或者您甚至可以使用替代返回值来做一些花哨的事情,例如#(get #{nil} % :not-found)
这不是您要问的问题,而不是 Clojure 特有的问题吗?
你可以问:
> (filter nil? #{nil 1 2 3})
> (nil)
它告诉你集合中有一个 nil;你得到了你所要求的——你问了一个模棱两可的问题,得到了一个适当模棱两可的回答。