À Clojure nil?
vérifie zéro. Comment vérifie-t-on non nul?
Je veux faire l'équivalent Clojure du code Java Java:
if (value1==null && value2!=null) {
}
Suivi: J'espérais un chèque non nul au lieu de l'envelopper avec not
. if
a un if-not
homologue. Existe-t-il une telle contrepartie pour nil?
?
Une autre façon de définir not-nil?
utiliserait la fonction complement
, qui inverse simplement la véracité d'une fonction booléenne:
(def not-nil? (complement nil?))
Si vous avez plusieurs valeurs à vérifier, utilisez not-any?
:
user> (not-any? nil? [true 1 '()])
true
user> (not-any? nil? [true 1 nil])
false
Après Clojure 1.6, vous pouvez utiliser some?
:
(some? :foo) => true
(some? nil) => false
Ceci est utile, par exemple, comme prédicat:
(filter some? [1 nil 2]) => (1 2)
Si vous n'êtes pas intéressé à distinguer false
de nil
, vous pouvez simplement utiliser la valeur comme condition:
(if value1
"value1 is neither nil nor false"
"value1 is nil or false")
Dans Clojure, nil compte comme faux aux fins des expressions conditionnelles.
Par conséquent (not x)
fonctionne fonctionne exactement comme (nil? x)
dans la plupart des cas (à l'exception de booléen false). par exemple.
(not "foostring")
=> false
(not nil)
=> true
(not false) ;; false is the only non-nil value that will return true
=> true
Donc, pour répondre à votre question initiale, vous pouvez simplement faire:
(if (and value1 (not value2))
...
...)
Si vous voulez que votre test renvoie true
lorsqu'il est donné false
, alors vous avez besoin d'une des autres réponses ici. Mais si vous voulez simplement tester qui retourne une valeur véridique chaque fois qu'il passe quelque chose d'autre que nil
ou false
, vous pouvez utiliser identity
. Par exemple, pour supprimer nil
s (ou false
s) d'une séquence:
(filter identity [1 2 nil 3 nil 4 false 5 6])
=> (1 2 3 4 5 6)
Vous pouvez essayer quand ce n'est pas le cas :
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
condition: (and (nil? value1) (not (nil? value2)))
if-condition: (if (and (nil? value1) (not (nil? value2))) 'something)
EDIT: Charles Duffy fournit une définition personnalisée correcte pour not-nil?
:
Vous voulez un non-nul? Facile à faire:
(def not-nil? (comp not nil?))
Si vous voulez un not-nil?
, alors je suggère de la définir comme suit:
(defn not-nil?
(^boolean [x]
(not (nil? x)))
Cela dit, il vaut la peine de comparer son utilisation à l'alternative évidente:
(not (nil? x))
(not-nil? x)
Je ne suis pas sûr que l'introduction d'une fonction non standard supplémentaire en vaille la peine pour enregistrer deux caractères/un niveau d'imbrication. Cela aurait du sens si vous vouliez l'utiliser dans des fonctions d'ordre supérieur, etc.