Clojure不是零检查

Ste*_*Kuo 53 clojure

在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)

  • @madstap怎么样?问题是如何检查不是'nil`的值,而`(1 false 2)`都不是'nil`. (7认同)
  • 可能的问题:`(过滤一些?[1 nil false 2])=>(1 false 2)` (4认同)

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

如果你不感兴趣的区分falsenil,你可以只使用该值作为条件:

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

  • 这个答案不是正好相反吗?(not "foostring") => false 与我期望 (not-nil? "foostring") 相反,我也期望 (not-nil? nil) 返回 false 而不是 true。 (2认同)

Ale*_*lin 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?))


Mar*_*ars 5

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

(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)