2011-11-21 97 views
11

在Clojure中測試空載體的最佳方法是什麼?我預計這將打印爲false:如何在Clojure中測試空載體

(if [] "true" "false") 

但它沒有。這樣做:

(if (> (count []) 0) "true" "false") 

但很笨拙 - 是否有一個較短的構造?

+0

'[]'是空的矢量,不是空的列表,不是嗎? – Svante

+0

@Svante是的。我懷疑凱文只想測試一個空集合,但是在列表中使用一個向量作爲他的例子。 – amalloy

+0

你是對的;我編輯了這個問題。遇到問題,因爲人們搜索「clojure測試空列表」可能希望找到這個問題... –

回答

27

使用標準謂詞(empty? list)

+7

此外,您應該在嘗試確定列表是否爲空時使用(seq列表)。 – nickmbailey

+0

要小心這種或那種方式,你會認爲'nil'是一個空的序列。 '(空?零); => true'和'(seq nil); => nil'。在我的例子中很少有人不希望出現這種行爲,所以我會用'#(和%(empty?%)'來測試是否有序列和空「 – foki

0

除了Mishadoff的回答(這是更可讀的),你也可以比較反對一個空列表本身(並保存兩個字符長度):

(if (=() []) "true" "false") 

嗯......我仍然認爲我更喜歡Mishadoff的回答。

+0

剛剛意識到,如果零計算結果爲false, –

+5

在clojure中,只有'nil'和'false'構成邏輯錯誤,零是truthy。 – Scott

+1

這不是一個好方法,nil不等於零。到(),但它應該被視爲一個空列表。 – amalloy

16

我在Clojure代碼中查看非空列表的最常見方式是使用seq。如果集合爲空,則返回nil,否則返回有效的seq對象。使用的

實施例:

(seq []) 
=> nil 

(seq nil) 
=> nil 

(seq [1 2 3]) 
=> (1 2 3)   ;; note this is a "true value" 

(if (seq [1 4 6]) "true" "false") 
=> "true" 

(if (seq []) "true" "false") 
=> "false" 

也可以使用empty?測試相反(即測試空集)。請注意空的?在clojure源代碼中實現爲(not (seq coll)),因此您可以安心地知道這兩種方法基本上是等價的。