2012-08-07 22 views
42

En Clojure nil? comprueba nil. ¿Cómo se puede verificar si no es nulo?Clojure not nil check

Quiero hacer el equivalente Clojure del siguiente código de Java:

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

Seguimiento: que estaba esperando un no nulo comprobar en lugar de envolver con not. if tiene una contraparte if-not. ¿Existe una contraparte para nil??

+7

¿Quieres un no-nil? Fácil de hacer: '(def not-nil? (Comp not nil?))' –

+5

Debe aceptar [respuesta de liwp] (http://stackoverflow.com/a/24043448/405550). Mucha gente que llega desde Google no pasará por la respuesta aceptada para descubrir que lo opuesto a 'nil?' Es 'some?' – Zaz

Respuesta

43

Otra manera de definir not-nil? sería el uso de la función complement, que simplemente invierte el truthyness de una función booleana:

(def not-nil? (complement nil?)) 

Si tiene varios valores para comprobar a continuación, utilizar not-any?:

user> (not-any? nil? [true 1 '()]) 
true 
user> (not-any? nil? [true 1 nil]) 
false 
+0

@ la respuesta de mikera debe seleccionarse como la respuesta correcta. – wegry

4

condición: (and (nil? value1) (not (nil? value2)))

si acondicionado: (if (and (nil? value1) (not (nil? value2))) 'something)

EDIT: Charles Duffy proporciona definición personalizada correcta para not-nil?:

¿Quieres una no-nula? Fácil de hacer: (def not-nil? (comp not nil?))

15

Si usted no está interesado en distinguir false de nil, sólo puede utilizar el valor como la condición:

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

Si desea una función not-nil?, a continuación, me gustaría sugerir simplemente definirla de la siguiente manera:

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

Dicho esto, vale la pena comparando el uso de este a la alternativa obvia:

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

no estoy seguro de que la introducción de una función adicional no estándar vale la pena para salvar dos caracteres/un nivel de anidamiento . Sin embargo, tendría sentido si quisiera usarlo en funciones de orden superior, etc.

14

En Clojure, nil cuenta como falso a los efectos de las expresiones condicionales.

Como resultado, (not x) funciona en realidad funciona exactamente igual que (nil? x) en la mayoría de los casos (con la excepción de booleano falso). p.ej.

(not "foostring") 
=> false 

(not nil) 
=> true 

(not false) ;; false is the only non-nil value that will return true 
=> true 

Así que para responder a su pregunta original que sólo puede hacer:

(if (and value1 (not value2)) 
    ... 
    ...) 
+1

¿No es esta respuesta exactamente lo opuesto? (no "foostring") => false es opuesto a lo que esperaría de (not-nil? "foostring") también esperaría que (no-nil? nil) devolviera false no es cierto. – mikkom

4

Usted puede intentar 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 
4

Si desea que su prueba para volver true cuando se administra false, a continuación, necesitas una de las otras respuestas aquí. Pero si solo desea probar que devuelve un valor verdadero cada vez que haya pasado algo que no sea nil o false, puede usar identity. Por ejemplo, para despojar nil s (o false s) a partir de una secuencia:

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

Después de Clojure 1.6 puede utilizar some?:

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

Esto es útil, por ejemplo, como un predicado:

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

Posible gotcha: '(¿filtro alguno? [1 nil falso 2]) => (1 falso 2)' – madstap

+2

@madstap ¿Cómo es eso? La pregunta pregunta cómo verificar los valores que no son 'nil', y ninguno de' (1 falso 2) 'son' nil'. –

+0

Sí, en realidad tienes razón ... No sé por qué me sorprendió ¯ \ _ (ツ) _/¯ – madstap