簡體   English   中英

如何從Clojure中的first獲取默認值?

[英]How do I get a default value from first in Clojure?

(> 1 (first []))返回NullPointerException。

如何使(first [])返回默認值,例如0,而不是nil?

您可以使用or繞過nil

(> 1 (or (first []) 0))

因為在Clojure中, nil被視為虛假值。

or解決方案適用於這種情況。 對於其中的情況下or是不夠的,另一種選擇是使用with-exception-default的宏從圖珀洛庫

(with-exception-default default-val & body)
 "Evaluates body & returns its result.  In the event of an exception the
  specified default value is returned instead of the exception."

(with-exception-default 0
  (Long/parseLong "12xy3"))
;=> 0

使用fnil

用0替換>第二個nil參數的函數是...

(fnil > nil 0)

例如,

((fnil > nil 0) 1 (first []))
=> true

恕我直言,您應該清楚地定義設計中的功能對象

因為您需要功能:給定集合coll提取第一個元素或默認為0,那么您應該為此使用一個單獨的函數。

例如

(defn first-or-zero [coll] 
 (if (seq coll)
   (first coll) 0))

盡管編寫起來有點麻煩(並且or宏的確使您更快地到達了那兒,但您卻錯過了功能強大的FP概念。

a)這樣,您對需要做的事情有純粹的功能描述b)您可以通過證明或通過單元測試來對其進行測試c)您可以在所有地方重復使用它,而對更改的影響最小

FP的一種更有效的實現方式是:

(defn first-or-default 
  ([coll] (first-or-default coll 0))
  ([coll dflt-val] 
   (if (seq coll)
      (first coll) dflt-val)))

然后只需調用: (< 1 (first-or-default coll 0))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM