2013-09-05 8 views
5

Pochodzę z ciężkiego tła javascript i uczenia się clojure.Jak przypisać wartość domyślną, jeśli bieżąca wartość wynosi zero w Clojure?

W js możemy zrobić;

var aVariable; //evaluates as falsy 
var x = aVariable || 'my Default String'; 

Jak to zrobić w clojure?

Aktualnie czytam nagłówek z mapy żądania pochodzącej z compojure.

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"])] 
    (println x-forwarded-for) 
) 

W przypadku, gdy nagłówek "x-forwarded-for" nie istnieje, wartość x-forwarded-for jest zerowa. Jaki jest właściwy sposób testowania dla zer, a następnie ponownego przypisania x-forwarded-for na inną wartość?

Odpowiedz

8

szczęście get-in funkcja has a not-found parameter dokładnie tego przypadku użycia:

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"] 
           "default value")] 
    (println x-forwarded-for)) 

Ogólnie, można użyć or jak @prismofeverything powiedział.

+1

W rzeczywistości użycie "lub" do ustawienia wartości zastępczych jest bardzo idiomatyczne w kodzie, który widziałem. – Alex

9

Można użyć wbudowanego or:

(let [x-forwarded-for (or (get-in request [:headers "x-forwarded-for"]) "my Default String")] 
    (println x-forwarded-for)) 

Jeżeli pierwsza klauzula jest nil, to użyje sekundę.

+0

To jest idiomatyczne i działa dobrze, ale należy zachować ostrożność wokół logicznych, jak 'FALSE spowoduje również, że spadnie do (nie wiadomo z pytaniem OP czy to pożądane zachowanie tutaj). – Alex

1

fnil został zaprojektowany dla tego

user> ((fnil println "hello") nil) 
hello 
nil 
user> ((fnil println "hello") "world") 
world 
nil 
user> ((fnil println "hello") false) 
false 
nil 
+0

to jest całkiem fajne ... bardziej wyspecjalizowany przypadek (to tak, jakby natychmiast wywoływać narzędzie, które było bardziej zaprojektowane do funkcji curry), ale szersze możliwości wykorzystania tego do stworzenia funkcji curried z ustawieniami domyślnymi, które mają zastosowanie tylko w pewien kontekst leksykalny jest naprawdę fajny – jm0

Powiązane problemy