63

在 Clojurenil?中检查 nil。如何检查非零?

我想做与以下 Java 代码等效的 Clojure:

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

跟进:我希望有一个 not nil 检查,而不是用not. ifif-not对应的。有这样的对应nil?吗?

4

9 回答 9

94

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

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

这很有用,例如,作为谓词:

(filter some? [1 nil 2]) => (1 2)
于 2014-06-04T17:05:45.760 回答
50

另一种定义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 
于 2012-08-07T21:47:04.457 回答
19

如果您对区分 不感兴趣falsenil则可以使用该值作为条件:

(if value1
   "value1 is neither nil nor false"
   "value1 is nil or false")
于 2012-08-08T03:11:34.907 回答
18

在 Clojure中,出于条件表达式的目的, nil 被视为 false

因此,(not x)工作实际上与大多数情况下的工作方式完全相同(nil? x)(布尔值 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)) 
   ... 
   ...)
于 2012-08-10T03:21:55.957 回答
7

健康)状况:(and (nil? value1) (not (nil? value2)))

如果条件:(if (and (nil? value1) (not (nil? value2))) 'something)

编辑:Charles Duffy 提供了正确的自定义定义not-nil?

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

于 2012-08-07T21:31:01.587 回答
6

true如果您希望您的测试在给出时返回false,那么您需要此处的其他答案之一。但是,如果您只是想测试它在传递除nilor以外的东西时返回一个真值false,您可以使用identity. 例如,从序列中剥离nils(或s):false

(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
于 2014-03-13T14:51:51.810 回答
4

您可以尝试when-not

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
于 2012-11-29T12:48:18.110 回答
2

如果您想要一个not-nil?功能,那么我建议您将其定义如下:

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

话虽如此,值得将其用法与明显的替代方法进行比较:

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

我不确定引入额外的非标准函数是否值得保存两个字符/一级嵌套。但是,如果您想在高阶函数等中使用它,那将是有意义的。

于 2012-08-08T05:09:34.580 回答
1

另一种选择:

(def not-nil? #(not= nil %))
于 2020-01-29T06:46:58.467 回答