2014-09-20 11 views

उत्तर

28

if का उपयोग करें जब आपके पास वास्तव में एक सच्चाई और एक झूठा मामला है और आपको do ब्लॉक की आवश्यकता नहीं है। इसके विपरीत, when का उपयोग तब किया जाना चाहिए जब आपको केवल सच्चे मामले और अंतर्निहित do को संभालना होगा। गति में कोई अंतर नहीं है, यह सबसे बेवकूफ शैली का उपयोग करने की बात है।

(if (my-predicate? my-data) 
    (do-something my-data) 
    (do-something-else my-data)) 

(when (my-predicate? my-data) 
    (do-something my-data) 
    (do-something-additionally my-data)) 

if मामले में, केवल do-something अगर my-predicate? एक truthy परिणाम देता है, जबकि when मामले में, दोनों do-something और do-something-additionally क्रियान्वित कर रहे हैं चलाया जाएगा।

+1

क्या होगा यदि मुझे केवल सही मामले को संभालना पड़े, और कोई अंतर्निहित 'डू' की आवश्यकता नहीं है, जो इस मामले में उपयोग करने के लिए अधिक पारंपरिक है? – damonh

+0

'कब' का प्रयोग करें। 'Do' भाग 'if'' को प्राथमिकता देने के लिए एक अतिरिक्त अच्छा कारण है, यदि आवश्यक पूर्व शर्त नहीं है। – schaueho

5

if का उपयोग करें जब आपके पास दो अलग-अलग अभिव्यक्तियां हों: true खंड और false खंड के लिए।

when और when-not दो मामलों में उपयोगी होते हैं:

  • आप एक या कई (अंतर्निहित do यहाँ मदद करता है) गैर शुद्ध संचालन सशर्त प्रदर्शन करने के लिए चाहते हैं जब;
  • जब आप true (या falsewhen-not के मामले में) का अनुमान लगाते हैं तो कुछ मूल्यांकन करना चाहते हैं, और विपरीत मामले में nil लौटाएं।

फर्क सिर्फ इतना है के रूप में, वहाँ false और nil के बीच कोई बड़ा अंतर यह है झूठी की वापसी या नहीं के बराबर

है दोनों तार्किक संदर्भ में false का मूल्यांकन।

+0

मैंने क्लोजर और कॉमन लिस्प में 'कब' के उपयोग में एक स्टाइलिस्ट अंतर देखा है। सीएल में, कुछ लोग 'कब' का उपयोग करने में बुरा मानते हैं यदि परीक्षण विफल होने पर आप वापसी मूल्य की परवाह करते हैं; उस स्थिति में आपको 'if' के अंतिम खंड में स्पष्ट रूप से' शून्य 'वापस करना चाहिए। यह समझ में आता है कि एक ही स्थिति में क्लोजर में 'कब' का उपयोग करना आम है, क्योंकि अधिकांश कोड क्लोजर में पूरी तरह कार्यात्मक है: वापसी मूल्यों को शायद ही कभी अनदेखा किया जाता है। यदि क्लोजर प्रोग्रामर सीएल सम्मेलन का पालन करते हैं, तो 'कब' शायद ही कभी पूरी तरह से कार्यात्मक कोड में उपयोग किया जाएगा। (कभी-कभी 'शून्य' बनाम 'झूठा' मामले।) – Mars

+0

@ मर्स, यह दिलचस्प है, क्या क्लोजर में 'झूठी' और 'शून्य 'के सह-अस्तित्व के लिए वास्तविक कारण है? मैं ऐसी स्थिति के बारे में सोच सकता हूं जब 'झूठा' ऐसा कुछ कर सकता है जो 'शून्य' नहीं कर सका। – Mark

+0

मुझे लगता है कि सामान्य विचार यह है: 'शून्य' का अर्थ है "अनुक्रम में कुछ भी नहीं बचा है", जबकि 'झूठी' का मतलब झूठा है। तथ्य यह है कि 'शून्य' का भी अर्थ है झूठी अनुक्रम के अंत के लिए परीक्षण की अनुमति देता है। इसके अलावा, आप चीजें कर सकते हैं जैसे '(get {: a 1: b nil}: c false) '। अधिक चर्चा [यहां] (http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-chechemes-true-false-are-broken), [यहां] (http://stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-checheme), [यहां] (http://www.lispcast.com/ नील-पनिंग), और [यहां] (http://clojure.org/lazy)। – Mars

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