在Clojure中nil?
检查是否为零。如何检查不是nil?
我想做Clojure等效的以下Java代码:
if (value1==null && value2!=null) {
}
后续行动:我希望不用nil检查,而不是用not
包裹它。 if
有一个if-not
对应方。 nil?
是否有这样的对应物?
答案 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)
如果您不想将false
与nil
区分开来,可以将该值用作条件:
(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
,那么您需要其中一个其他答案。但是,如果您只是想测试,只要传递了nil
或false
以外的其他内容,就会返回真值,您可以使用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 %))