2012-08-07 45 views
42

在Clojure nil?檢查爲零。如何檢查不是零?Clojure不爲零檢查

我想做的Clojure等同於Java代碼的:

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

後續:我希望的是不爲零檢查與not包裹它代替。 if有一個if-not副本。有沒有這樣的nil?對應?

+7

你想要一個非零?輕鬆完成:'(def not-nil?(comp not nil?))' – 2012-08-07 21:39:33

+5

您應該接受[liwp's answer](http://stackoverflow.com/a/24043448/405550)。從谷歌到這裏的很多人不會滾動過去接受的答案,以發現「零?」的對面是「某?」 – Zaz 2016-07-29 04:56:50

回答

43

另一種方式來定義not-nil?將使用complement功能,它只是反轉布爾函數的truthyness:

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

如果你有幾個要檢查的值,然後使用not-any?

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

@應當選擇mikera的答案作爲正確答案。 – wegry 2015-10-18 19:39:03

4

條件:(and (nil? value1) (not (nil? value2)))

如果條件:(if (and (nil? value1) (not (nil? value2))) 'something)

編輯: 查爾斯·達菲爲not-nil?正確的自定義的定義:

你想要一個不爲零?容易實現:(def not-nil? (comp not nil?))

15

如果你不感興趣,從區分false 0,你可以使用該值作爲條件:

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

如果你想有一個not-nil?功能,那麼我建議只是將其定義如下:

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

說了,這是值得這種用法比較明顯的替代:

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

我不知道,引入一個額外的非標準功能是值得保存兩個字符/一級嵌套。如果你想在高階函數中使用它,這將是有意義的。

14

在Clojure中,對於條件表達式而言,零無效。

因此(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 

因此,要回答你原來的問題,你可以這樣做:

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

這不正是完全相反嗎? (不是「foostring」)=> false與我期望的(not-nil?「foostring」)相反,我也希望(not-nil?nil)返回false不正確。 – mikkom 2013-12-03 18:57:01

4

您可以嘗試 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

如果你想給false當你的測試返回true,然後你需要這裏的其他答案之一。但是,如果只是想測試一次,只要它通過nilfalse以外的其他值,就可以使用identity。例如,爲了從序列剝離nil S(或false多個):

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

的Clojure 1.6後,可以使用some?

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

這是有用的,例如,作爲謂詞:

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

可能的問題:'(過濾一些?[1 nil false 2])=>(1 false 2)' – madstap 2015-07-14 01:16:10

+2

@madstap怎麼會這樣?問題是如何檢查非'nil'的值,而'(1 false 2)'都不是'nil'。 – 2016-08-16 16:50:18

+0

是啊,其實你是對的......不知道爲什麼我感到驚訝¯\ _(ツ)_ /¯ – madstap 2016-09-16 03:25:17