Clojure不是零检查

时间:2012-08-07 21:27:00

标签: clojure

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

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

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

后续行动:我希望不用nil检查,而不是用not包裹它。 if有一个if-not对应方。 nil?是否有这样的对应物?

9 个答案:

答案 0 :(得分:72)

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

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

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

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

答案 1 :(得分:46)

定义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 

答案 2 :(得分:18)

如果您不想将falsenil区分开来,可以将该值用作条件:

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

答案 3 :(得分:15)

在Clojure中, nil在条件表达式中被视为错误

结果(not x)在大多数情况下实际上与(nil? x)完全相同(除了布尔值false)。 e.g。

(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)) 
   ... 
   ...)

答案 4 :(得分:5)

如果您希望测试在给定true时返回false,那么您需要其中一个其他答案。但是,如果您只是想测试,只要传递了nilfalse以外的其他内容,就会返回真值,您可以使用identity。例如,要从序列中删除nil s(或false s):

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

答案 5 :(得分:4)

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

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

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

  

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

答案 6 :(得分: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

答案 7 :(得分:1)

如果你想要一个not-nil?函数,那么我建议你按如下方式定义它:

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

已经说过将这种用法与明显的替代方案进行比较是值得的:

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

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

答案 8 :(得分:1)

另一个选择:

(def not-nil? #(not= nil %))