2012-08-07 21 views
42

In Clojure nil? prüft auf Null. Wie prüft man auf nicht Null?Clojure nicht nicht überprüfen

Ich möchte die Clojure Äquivalent der folgenden Java-Code tun:

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

Follow-up: ich für eine hatte gehofft, nicht anstelle von null überprüfen Sie es mit not Verpackung. if hat ein if-not Gegenstück. Gibt es ein solches Gegenstück für nil??

+7

Sie wollen ein nicht-nil? Einfach gemacht: '(def not-nil? (Comp nicht nil?))' –

+5

Du solltest [liwps Antwort] akzeptieren (http://stackoverflow.com/a/24043448/405550). Viele Leute, die hier von Google ankommen, werden nicht an der akzeptierten Antwort vorbei blättern, um herauszufinden, dass das Gegenteil von 'nil?' 'Some?' Ist. – Zaz

Antwort

43

Eine weitere Möglichkeit, not-nil? zu definieren wäre mit der complement-Funktion, die nur die truthyness einer Booleschen Funktion umkehrt:

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

Wenn Sie mehrere Werte haben dann not-any? überprüfen verwenden:

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

@ mikers Antwort sollte als richtige Antwort ausgewählt werden. – wegry

4

Zustand: (and (nil? value1) (not (nil? value2)))

if-Bedingung: (if (and (nil? value1) (not (nil? value2))) 'something)

EDIT: Charles Duffy korrekte individuelle Definition für not-nil? bietet:

Sie wollen eine nicht-Null? Kein Problem: (def not-nil? (comp not nil?))

15

Wenn Sie nicht daran interessiert sind, zu unterscheiden false von nil, kann man einfach den Wert als Bedingung verwenden:

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

Wenn Sie eine not-nil? Funktion wollen, dann würde ich vorschlagen, definieren sie wie folgt:

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

Having said dass es sich lohnt die Verwendung dieses auf die offensichtliche Alternative zu vergleichen:

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

ich bin nicht sicher, dass eine zusätzliche nicht-Standard-Funktion einzuführen, ist es wert für das Speichern von zwei Zeichen/eine Ebene der Verschachtelung . Es wäre jedoch sinnvoll, wenn Sie es in Funktionen höherer Ordnung usw. verwenden möchten.

14

In Clojure, gilt NULL als falsch für die Zwecke der bedingten Ausdrücke.

Als Ergebnis funktioniert (not x) tatsächlich funktioniert genauso wie (nil? x) in den meisten Fällen (mit Ausnahme von Boolean falsch). z.B.

(not "foostring") 
=> false 

(not nil) 
=> true 

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

So Ihre ursprüngliche Frage zu beantworten, können Sie einfach tun:

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

Ist diese Antwort nicht genau das Gegenteil? (nicht "fosestring") => falsch ist das Gegenteil von dem, was ich erwarten würde (nicht-nil? "foestring") auch ich würde erwarten (nicht-nil? nil), falsch, nicht wahr zurückzukehren. – mikkom

4

können Sie versuchen, 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

Wenn Sie Ihren Test wollen true zurückzukehren, wenn false gegeben, dann Sie brauchen hier eine der anderen Antworten. Aber wenn Sie nur testen möchten, dass ein truthy Wert zurückgegeben wird, wenn es etwas anderes als nil oder false passiert, können Sie identity verwenden. Zum Beispiel nil s (oder false s) aus einer Sequenz abzustreifen:

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

Nach 1,6 Clojure können Sie verwenden some?:

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

Dies ist nützlich, zum Beispiel als Prädikat:

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

Mögliche Gotcha: '(Filter einige? [1 Null falsch 2]) => (1 falsch 2)' – madstap

+2

@madstap Wie so? Die Frage fragt, wie man nach Werten sucht, die nicht "nil" sind, und keine von "(1 false 2)" ist "nil". –

+0

Ja, eigentlich hast du recht ... Keine Ahnung warum ich überrascht war ¯ \ _ (ツ) _/¯ – madstap

Verwandte Themen