2013-09-05 3 views
5

मैं एक भारी जावास्क्रिप्ट पृष्ठभूमि और सीखने के क्लोजर से आ रहा हूं।क्लोजर में मौजूदा मान शून्य होने पर डिफ़ॉल्ट मान कैसे असाइन करें?

जेएस में हम कर सकते हैं;

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

आप क्लोजर में यह कैसे करते हैं?

वर्तमान में मैं कंपोज़र से आने वाले अनुरोध मानचित्र से एक शीर्षलेख पढ़ रहा हूं।

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

मामले में जहां 'X-Forwarded-के लिए' शीर्षक मौजूद नहीं है, एक्स-अग्रेषित-के लिए मूल्य नहीं के बराबर है में। शून्य के लिए परीक्षण करने का सही तरीका क्या है और उसके बाद x-forwarded को फिर से असाइन करें-किसी अन्य मान के लिए?

उत्तर

8

सौभाग्य से वास्तव में उपयोग के इस मामले get-in समारोह has a not-found parameter:

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

सामान्य तौर पर, आप or इस्तेमाल कर सकते हैं के रूप में @prismofeverything कहा।

+1

दरअसल, फ़ॉलबैक मान सेट करने के लिए 'या' का उपयोग करके मैंने देखा है कि कोड में बहुत मूर्खतापूर्ण है। – Alex

9

आप का उपयोग में निर्मित or कर सकते हैं:

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

तो पहले खंड nil है, यह दूसरे का प्रयोग करेंगे।

+0

यह मुहावरेदार है और अच्छी तरह से काम करता है, लेकिन बूलियन्स आसपास सावधान रहना होगा, के रूप में 'FALSE' भी इसके माध्यम से गिरावट का कारण होगा (यह ओपी के सवाल है कि यहाँ व्यवहार वांछित है कि क्या से स्पष्ट नहीं है के लिए डिजाइन किया गया था)। – Alex

1

fnil इस

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

यह बहुत अच्छा है ... एक विशेष मामले में से अधिक (यह तुरंत उपयोगिता का आह्वान करने जैसा है जो फ़ंक्शन करी के लिए अधिक डिज़ाइन किया गया था), लेकिन वास्तव में इसका उपयोग करने वाले व्यापक रूप से एक व्यंग्य फ़ंक्शन बनाने के लिए इसका उपयोग करने की व्यापक संभावनाएं जो केवल एक के भीतर लागू होती हैं कुछ व्याख्यात्मक संदर्भ वास्तव में अच्छा है – jm0

संबंधित मुद्दे