2011-04-17 17 views
20

içinde bir değer nasıl seçilir Clojure nil için sınamak için bir deyim ve bir şey nil ise sonra bir değer değiştirmek için nedir?clojure içinde nil

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

:

Mesela ben bu sürü yapmak ama repetetive "girdi-argüman" iki kez kullanmak zorunda bulabilirsiniz.

+0

vardır Bir fonksiyon için [çoklu imzalar] (http://stackoverflow.com/questions/3208347/how-to-create-default-value-for-function-argument-in-clojure) tanımlayabileceğinizden habersizsiniz. – coredump

cevap

17

"veya" aynı zamanda bu deyimsel sadecenil değerlerini değiştirmez edeceğini senin örneğin kodunu yeniden, ama dikkat etmek yolu, ancak gerçekten de Alex'in önerisi false. Eğer değer tutmak false ama nil atmak istiyorsanız

şunlar gereklidir:

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

Bu deyimsel cevap, nil için değil, yanlış olarak test etmek olabilir. Bu arada, çoğu çalışma tek bir değeri kontrol etmek yerine koleksiyonlar üzerinde yapılma eğiliminde olduğu için, yukarıdaki cevabın harita versiyonu şöyledir: (harita # (eğer (nil?%) "Bu yok"%) coll) –

+3

Belki, ama OP nil'i kontrol etmek için deyim yerindeydi. Örneğini çevreleyen onaylanmamış kodu nasıl yapılandırması gerektiği üzerine yorum yapamam. :-) – sanityinc

67

sadece kullanmak veya:

(or input-argument "default") 
+0

Güzel bir :-). (If-let [result input-argument] sonucu "default" ile hantal bir şey yapmış olurdum). Bunu hatırlayacağım ya da! –

+3

Eğer input-argümanı nil veya false ise, bunun istenmeyebilecekse, “default” değerini verecektir. –

5

sadece sağ değeri elde yapmak değişkeni bağlanmayan ve iki kez bir başka yolu yoktur kullanmak durumunda yapabilir. Özünde fnil adlı bir işlev var.

Aramak istediğiniz işlevle ve varsayılan argümanı ile fnil numaralı telefonu arayın. Bu, sağladığınız varsayılan değerle birlikte nils'in yerini alacaktır.

İstediğinize bağlı olarak bunlardan birini yapabilirsiniz. Yerel bir işlev oluşturun.

(her zaman aynı varsayılan argüman var) Eğer kod dışarı bunu mantığa taşımak ve özgün işlevine edildi için nereye koymak (veya diğer ihtimaline karşı fonksiyonunu sarabilirsiniz somecases ise
(let [default-fn (fnil fn-you-want-to call "default-argument")] 
(default-fn input-argument)) 

kütüphane). Sonra

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

Kodunuzdaki onun sadece

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

Daha burada bulabilirsiniz düşürüldü: Bu giriş argümanlarla özellikle bir sürü yaparsanız o zaman belki http://clojuredocs.org/clojure_core/clojure.core/fnil