2011-04-17 8 views
20

क्लोजर में शून्य के लिए परीक्षण करने का बेवकूफ तरीका क्या है और यदि कोई मूल्य बदलता है तो मूल्य को प्रतिस्थापित करने के लिए?क्लोजर में यदि कोई मान चुनने के लिए शून्य

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

उत्तर

17

की "या" वास्तव में अपने उदाहरण कोड को फिर से लिखने, लेकिन ध्यान रखें कि यह केवलnil मूल्यों की जगह नहीं होंगे मुहावरेदार तरह से, लेकिन यह भी उन है एलेक्स के सुझाव जो false हैं।

आप मूल्य रखने के लिए false लेकिन nil त्यागने चाहते हैं, आप की जरूरत है:

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

मूर्खतापूर्ण उत्तर इस प्रकार शून्य के बजाए झूठी जांच कर सकता है। वैसे, जैसा कि अधिकांश काम संग्रह पर किया जाता है, एक मूल्य की जांच करने के बजाय, उपर्युक्त उत्तर का नक्शा संस्करण है: (नक्शा # (यदि (शून्य)%) "यह शून्य"%) coll था) –

+3

शायद, लेकिन ओपी 'शून्य' की जांच करने के लिए बेवकूफ तरीके से पूछ रहा था। मैं इस बात पर टिप्पणी नहीं कर सकता कि उसे अपने उदाहरण के आस-पास के अनजान कोड को कैसे संरचित किया जाना चाहिए था। :-) – sanityinc

67

बस का उपयोग या:

(or input-argument "default") 
+0

अच्छा एक :-)। मैंने कुछ बोझिल किया होगा (अगर-[परिणाम इनपुट-तर्क] परिणाम "डिफ़ॉल्ट")। मुझे याद होगा या! –

+3

ध्यान दें कि यह "डिफ़ॉल्ट" मान देगा यदि इनपुट-तर्क शून्य या गलत है, जो शायद आप नहीं चाहते हैं। –

5

आप केवल चर सही मूल्य प्राप्त करने के लिए बाध्य है और यह दो बार वहाँ एक अन्य तरीका है कि आप नहीं है का उपयोग करने के हैं कर सकते है। कोर में एक फ़ंक्शन है जिसे fnil कहा जाता है।

आप जिस फ़ंक्शन को कॉल करना चाहते हैं और डिफ़ॉल्ट तर्क के साथ fnil पर कॉल करते हैं। यह एक फ़ंक्शन वापस करेगा जो आपके द्वारा प्रदान किए गए डिफ़ॉल्ट मान के साथ नाइल्स को प्रतिस्थापित करेगा।

आप जो चाहते हैं उसके आधार पर आप चीजों में से एक कर सकते हैं। एक स्थानीय समारोह बनाएँ।

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

somecases (जहां हमेशा एक ही डिफ़ॉल्ट तर्क है) आप अपने कोड से बाहर यह करने के लिए तर्क को स्थानांतरित और डाल यह मूल कार्य किया गया था, जहां कर सकते हैं (या एक दूसरे में मामले में समारोह लपेट इसमें पुस्तकालय)।

(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

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