याद रखें कि देरी याद की जाती है, इसलिए आपके पतों की देरी की लगातार कॉल हमेशा पहली बार उसी पते को प्राप्त करेगी जब आपने देरी को खराब कर दिया था।
(defn addresses [person-id]
{:home (str (rand-int 100) " Cool St.") :work "1243 Boring St."})
(defn person [id]
(merge {:addresses (delay (addresses id))} {:name "john"}))
(let [person1 (person 1)]
(println @(:addresses person1))
(println @(:addresses person1)))
यह प्रिंट होगा:
{:home 65 Cool St., :work 1243 Boring St.}
{:home 65 Cool St., :work 1243 Boring St.}
सूचना कैसे घर का पता देरी के दूसरे deref पर अपरिवर्तित है।
यदि आप इस व्यवहार को नहीं चाहते हैं तो आपको इसके बजाय फ़ंक्शन क्लोजर का उपयोग करने की आवश्यकता है।
(defn addresses [person-id]
{:home (str (rand-int 100) " Cool St.") :work "1243 Boring St."})
(defn person [id]
(merge {:addresses (fn [] (addresses id))} {:name "john"}))
(let [person1 (person 1)]
(println ((:addresses person1)))
(println ((:addresses person1))))
यह प्रिंट होगा:
{:home 16 Cool St., :work 1243 Boring St.}
{:home 31 Cool St., :work 1243 Boring St.}
सूचना कैसे घर का पता बंद करने के लिए उप सिलसिलेवार फोन पर अलग था।
तो, यदि आप addresses
फ़ंक्शन साइड-इफेक्ट करते हैं, तो डेटाबेस से पते प्राप्त करते हैं। और व्यक्ति अपने पते बदल सकते हैं, और आप चाहते हैं कि आपके कोड में हमेशा सबसे हालिया पता होना चाहिए, अगर डेले आपके लिए काम करता है, या यदि फ़ंक्शन क्लोजर बेहतर उम्मीदवार होगा तो यह ध्यान में रखना होगा।
स्रोत
2015-10-25 01:03:32
आपको बहुत बहुत धन्यवाद। मैं सोच रहा था कि इसे पारदर्शी बनाया जा सकता है, इसलिए इसे पहली बार इस्तेमाल किया जा सकता है। मैन्युअल रूप से मूल्यांकन मजबूर करने के बजाय? – Surya
मुझे ऐसा नहीं लगता है। जहां तक मुझे पता है, क्लोजर आलस्य और बल में स्पष्ट है। –
मेरा लैज़िमैप [लाइब्रेरी] (http://bitbucket.org/kotarak/lazymap) ठीक वही करता है। यह सभी मानचित्र प्रकारों के लिए पारदर्शी ड्रॉप-इन्स प्रदान करता है, जो उनके मूल्यों की गणना केवल तभी प्राप्त किए जाते हैं जब उन्हें वास्तव में पुनर्प्राप्त किया जाता है। – kotarak