2012-12-11 20 views
12

मेरे पास एक क्लोजर मानचित्र है। इसे opts नाम दें। मैं 2 तरीके इस नक्शे को ऐसी है कि अगर कोई कुंजी प्राप्त कुछ डिफ़ॉल्ट मान है से मूल्यों को प्राप्त करने के लिए पता है:क्लोजर मानचित्र में डिफ़ॉल्ट मान

(let [opts {} 
     title-1 (or (:title opts) "Default title") 
     title-2 (:title opts "Default title")] 
    (println title-1 title-2)) 

मैं कुछ पुस्तकालयों देखा (क्विल, incanter) or के साथ पहली दृष्टिकोण का उपयोग करें। ऐसा लगता है कि दूसरा दृष्टिकोण अधिक संक्षिप्त और क्लीनर है। क्या पहले दृष्टिकोण में फायदे हैं?
(or (:title opts) "Default value") का उपयोग करने का नुकसान यह है कि हम false और nil को अब मान के रूप में पास नहीं कर सकते हैं, इस मामले में डिफ़ॉल्ट मान हमेशा उपयोग किया जाता है।

+2

आप '(विकल्प प्राप्त करें: शीर्षक "डिफ़ॉल्ट शीर्षक") का भी उपयोग कर सकते हैं। – ponzao

+0

@ponzao जो भी बेहतर हो सकता है क्योंकि 'get' 'NullPointerException' को फेंक नहीं देगा यदि नक्शा शून्य है। यह या तो निर्दिष्ट होने पर 'शून्य' या डिफ़ॉल्ट मान वापस कर देगा। –

+0

@IvanKoblik '(शीर्षक शीर्षक" डिफ़ॉल्ट ") 'ठीक काम करता है। –

उत्तर

20

(or (:key hash) default) और (:key hash default) के बीच एक महत्वपूर्ण अंतर यह तथ्य है कि पूर्व में default का मूल्यांकन केवल आवश्यक है। बाद के मामले में इसका हमेशा मूल्यांकन किया जाता है। इसलिए default का मूल्यांकन महंगा होने पर आपको or का उपयोग करना चाहिए।

एक और अंतर तब स्पष्ट हो जाता है जब आपके हैश में बूलियन संदर्भ में गलत होते हैं। ऐसे मानों के मामलों में (or (:key hash) default) का मूल्यांकनया nil के बजाय default पर किया जाएगा, जो आप उम्मीद करते हैं। or अभिव्यक्ति के विपरीत, (:key hash default) सही परिणाम देगा। साइड नोट के रूप में, nil को हैश में मानों के रूप में संग्रहीत करने से पहले दो बार सोचें।

ठीक है, वे महत्वपूर्ण अंतर थे। अब चलो नाबालिगों के लिए चलो।

(or (:title opts) "Default title") 

;; Redacted for the sake of brevity. 
(let* [x (:title opts)] 
    (if x 
    x 
    "Default title")) 

यकीनन करने के लिए पाठक द्वारा विस्तार किया गया है, यह कम कुशल है की तुलना करने के लिए बस किसी भी मानक के बिना मूल्यांकन

(:title opts "Default title") 
बेशक

यह अनुमान लगाने के लिए अंतर नहीं है कठिन है गति, हालांकि मुझे विश्वास है कि यह मामूली होना चाहिए।

दूसरी तरफ, पहली नज़र में (or (:key hash) :default) किसी व्यक्ति के लिए (:key hash :default) idiom पर उपयोग नहीं किया जाने वाला आसान समझना प्रतीत होता है। अन्य भाषाओं से आने वाले प्रोग्रामर पर विचार करें। रूबी में उदाहरण के लिए हैश का एक गैर विद्यमान तत्व से निपटने के लिए ठेठ दृष्टिकोण

val = hash[:key] || :default 

इसलिए है, पहली अभिव्यक्ति पार्स करना अधिक आसान मनुष्य कुछ Clojure के मुहावरों के आदी नहीं द्वारा हो सकता है।

+2

मैं पूरी तरह से असहमत हूं कि आपको लगातार संगत होना चाहिए: प्रत्येक शैली कभी-कभी आवश्यक होती है। यदि डिफ़ॉल्ट अभिव्यक्ति की गणना करने के लिए डिफ़ॉल्ट अभिव्यक्ति बहुत महंगा है, या 'nil' या' false' मान्य मान हैं, तो आपको 'या' शैली का उपयोग करना चाहिए, और आपको "वहां कुछ भी नहीं" और "झूठी या शून्य" के बीच अंतर करने की आवश्यकता है क्या आप वहां मौजूद हैं"। – amalloy

+0

@amalloy, टिप्पणी के लिए धन्यवाद और महत्वपूर्ण मतभेदों को इंगित करते हुए। मैंने जवाब संशोधित कर दिया है। – Jan

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