如何确定clojure中nil的含义?

时间:2013-04-10 04:38:38

标签: clojure

例如,

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

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

我知道我可以使用

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

检查nil值。我现在想不出任何好的例子。

但一般来说,当返回nil时,如何确定nil是否表示找不到任何内容或者是否找到值nil?

2 个答案:

答案 0 :(得分:4)

nil只是一个值,其含义取决于上下文。

就像所有其他值一样:唯一需要注意的是它是falsy,即在条件表达式中计为false

需要注意三个特殊情况:

  • nil是用于表示空序列的返回值,例如在(seq [])
  • nil通常用作返回值以表示false,例如在(or false nil)
  • 当地图查找找不到给定的密钥时,默认情况下会返回
  • nil,例如在({:a 1} :b)

这些情况有时会引起歧义:如果是这样,那么你需要使用不同的功能。你的榜样很好:

  • (some #{nil} #{1 2 3}) => nil(失败 - 未找到结果)
  • (some #{nil} #{nil 1 2 3}) => nil(成功 - 未找到结果!!!)

在这种情况下,你只是选择了错误的功能:你不能使用集合#{nil}来检测nils ....而你只能使用nil?或甚至可以做某事喜欢#(get #{nil} % :not-found)

之类的替代回报值

答案 1 :(得分:1)

这不是你问的问题,而不是Clojure特别提出的问题吗?

你可以问:

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

告诉你集合中有一个零;你得到了你所要求的东西 - 你问了一个含糊不清的问题,并得到了一个适当的模糊回应。