3

例如,

> (some #{nil} #{nil 1 2 3})
nil

> (some #{} #{nil 1 2 3})
nil

我知道我可以使用

(some nil? #{nil 1 2 3})

检查零值。目前我想不出任何好的例子。

但是一般情况下,当返回 nil 时,如何判断 nil 是什么都没有找到还是 nil 的值被找到呢?

4

2 回答 2

4

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)

于 2013-04-10T05:16:35.797 回答
1

这不是您要问的问题,而不是 Clojure 特有的问题吗?

你可以问:

> (filter nil? #{nil 1 2 3})
> (nil)

它告诉你集合中有一个 nil;你得到了你所要求的——你问了一个模棱两可的问题,得到了一个适当模棱两可的回答。

于 2013-04-10T04:59:42.950 回答