web-dev-qa-db-fra.com

Clojure pas zéro chèque

À 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??

51
Steve Kuo

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 
47
Arthur Ulfeldt

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)
73
liwp

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")
18
Jouni K. Seppänen

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)) 
   ... 
   ...)
15
mikera

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 nils (ou falses) d'une séquence:

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

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
4
tdmadeeasy

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

4
Alexander Putilin

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.

2
mikera