2011-04-17 17 views
20

在Clojure什麼是測試爲零的慣用方法,如果某些東西是零,然後取代一個值?在clojure如何選擇一個值,如果沒有

比如我做了很多:

let [ val (if input-argument input-argument "use default argument")] 

:但我覺得它的repetetive不必使用「輸入參數」的兩倍。

+0

如果你這樣做了很多,特別是與輸入參數,那麼也許你是不知道你可以爲函數定義[多重簽名](http://stackoverflow.com/questions/3208347/how-to-create-default-value-for-function-argument-in-clojure)。 – coredump 2015-10-26 02:23:07

回答

17

的「或」確實是慣用的方式來重寫你的示例代碼,但請注意,它不會更換nil價值,而且這些Alex的建議這是false

如果你想保留價值false但放棄nil,您需要:

(let [val (if (nil? input-argument) "use default argument" input-argument)] 
    ...) 
+0

因此,慣用的答案可能是測試錯誤,而不是零。順便說一下,由於大多數工作都傾向於在集合上完成,而不是檢查單個值,所以上述答案的地圖版本是:(map#(if(nil?%)「this is nil」%)coll) – 2011-04-18 07:56:05

+3

也許,但是OP要求用慣用的方法來檢查'nil'。我無法評論他應該如何構建圍繞他的例子的未顯示的代碼。 :-) – sanityinc 2011-04-18 08:07:52

67

只是使用

(or input-argument "default") 
+0

不錯的:-)。 (if-let [result input-argument] result「default」)我會做一些麻煩的事情。我會記住或! – 2011-04-18 07:57:39

+3

請注意,如果輸入參數爲nil或false,則會給出「默認」值,這可能不是您想要的值。 – 2012-04-28 14:23:40

5

如果你只綁定變量做得到正確的值,而不是使用它兩次有你一個其他的方式可以做到。核心中有一項功能叫做fnil

您可以使用要調用的函數和默認參數調用fnil。這將返回一個函數,用您提供的默認值替換nils。

你可以根據自己的需要做一件事情。創建一個本地函數。

(let [default-fn (fnil fn-you-want-to call "default-argument")] 
(default-fn input-argument)) 

在一些情況下(在這裏你總是有相同的默認參數),你可以移動到邏輯做到這一點,你的代碼,並把它放在原來的函數(或包裹的功能的情況下,它在其他圖書館)。

(defn fn-you-want-to-call [arg] ....) 
(def fn-you-want-to-call-default (fnil fn-you-want-to-call "default-argument")) 

然後在你的代碼,它減少到只有

(fn-you-want-to-call-default input-argument) 

更多,你可以在這裏找到: http://clojuredocs.org/clojure_core/clojure.core/fnil

相關問題