Clojure不是无检查

在Clojure nil? 检查零。 如何检查不是零?

我想做下面的Java代码的Clojure等价物:

 if (value1==null && value2!=null) { } 

后续:我希望不是零检查,而不是用not包装。 if有一个if-not对应。 有没有这样一个对应的nil?

另一种定义not-nil? 将使用complement函数,它只是颠倒布尔函数的真实性:

 (def not-nil? (complement nil?)) 

如果你有几个值来检查然后使用not-any?

 user> (not-any? nil? [true 1 '()]) true user> (not-any? nil? [true 1 nil]) false 

在Clojure 1.6之后,你可以使用some?

 (some? :foo) => true (some? nil) => false 

这是有用的,例如,作为一个谓词:

 (filter some? [1 nil 2]) => (1 2) 

如果你不区分false ,你可以使用这个值作为条件:

 (if value1 "value1 is neither nil nor false" "value1 is nil or false") 

在Clojure中, 对于条件expression式来说零计数是错误的

因此,在大多数情况下(not x)实际上它的工作原理和(nil? x)完全一样(nil? x) boolean false除外)。 例如

 (not "foostring") => false (not nil) => true (not false) ;; false is the only non-nil value that will return true => true 

所以要回答你原来的问题,你可以做:

 (if (and value1 (not value2)) ... ...) 

条件:( (and (nil? value1) (not (nil? value2)))

if-condition: (if (and (nil? value1) (not (nil? value2))) 'something)

编辑:查尔斯·达菲提供正确的自定义not-nil?

你想要一个不零? 轻松完成: (def not-nil? (comp not nil?))

你可以试一试:

 user> (when-not nil (println "hello world")) =>hello world =>nil user> (when-not false (println "hello world")) =>hello world =>nil user> (when-not true (println "hello world")) =>nil user> (def value1 nil) user> (def value2 "somevalue") user> (when-not value1 (if value2 (println "hello world"))) =>hello world =>nil user> (when-not value2 (if value1 (println "hello world"))) =>nil 

如果你想让你的testing返回true时给出false ,那么你需要在这里的其他答案之一。 但是如果你只是想testing它返回一个truthy值,只要它通过非nilfalse之外的东西,你可以使用identity 。 例如,从序列中删除nil (或false

 (filter identity [1 2 nil 3 nil 4 false 5 6]) => (1 2 3 4 5 6) 

如果你想要一个not-nil? 函数,那么我build议只是定义它如下:

 (defn not-nil? (^boolean [x] (not (nil? x))) 

话虽如此,这是值得比较使用这个明显的select:

 (not (nil? x)) (not-nil? x) 

我不确定引入额外的非标准函数是否值得保存两个字符/一个级别的嵌套。 如果你想在高阶函数中使用它,这将是有道理的。