在Clojure nil?
检查为零.如何检查不是零?
我想做Clojure相当于以下Java代码:
if (value1==null && value2!=null) {
}
Run Code Online (Sandbox Code Playgroud)
后续行动:我希望不用零检查,而不是用它包裹not
.if
有一个if-not
对应物.是否有这样的对应物nil?
?
liw*_*iwp 74
在Clojure 1.6之后你可以使用some?
:
(some? :foo) => true
(some? nil) => false
Run Code Online (Sandbox Code Playgroud)
这很有用,例如,作为谓词:
(filter some? [1 nil 2]) => (1 2)
Run Code Online (Sandbox Code Playgroud)
Art*_*ldt 47
另一种定义not-nil?
方法是使用complement
函数,它只是反转布尔函数的真实性:
(def not-nil? (complement nil?))
Run Code Online (Sandbox Code Playgroud)
如果要检查多个值,请使用not-any?
:
user> (not-any? nil? [true 1 '()])
true
user> (not-any? nil? [true 1 nil])
false
Run Code Online (Sandbox Code Playgroud)
Jou*_*nen 18
如果你不感兴趣的区分false
从nil
,你可以只使用该值作为条件:
(if value1
"value1 is neither nil nor false"
"value1 is nil or false")
Run Code Online (Sandbox Code Playgroud)
mik*_*era 15
在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
Run Code Online (Sandbox Code Playgroud)
所以要回答你原来的问题,你可以这样做:
(if (and value1 (not value2))
...
...)
Run Code Online (Sandbox Code Playgroud)
健康)状况: (and (nil? value1) (not (nil? value2)))
如果条件: (if (and (nil? value1) (not (nil? value2))) 'something)
编辑:Charles Duffy 提供了正确的自定义定义not-nil?
:
你想要一个非零?轻松完成:
(def not-nil? (comp not nil?))
如果您希望测试true
在给定时返回false
,那么您需要其中一个其他答案.但是,如果你只是想测试,只要它传递的是nil
or或其他东西,就会返回一个真值false
,你可以使用identity
.例如,从序列中剥离nil
s(或false
s):
(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)