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值,只要它通过非nil
或false
之外的东西,你可以使用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)
我不确定引入额外的非标准函数是否值得保存两个字符/一个级别的嵌套。 如果你想在高阶函数中使用它,这将是有道理的。