2013-08-24 8 views
7

मुझे पता है कि जावा में, यदि मैं किसी ऑब्जेक्ट को तर्क के रूप में किसी ऑब्जेक्ट में पास करता हूं, तो विधि डुप्लिकेट बनाने के बजाय तर्क ऑब्जेक्ट को उसी ऑब्जेक्ट को देगी। क्लोजर में कैसे? उदाहरण के लिए:क्लोजर में तर्क कैसे गुजर रहा है?

(defn print-from-reader [rdr] 
    (print (.read rdr))) 

(...inside some code... 
    (with-open [rdr (Reader file)] 
    (print-from-rader rdr))) 

प्रिंट-से-पाठक स्मृति में आरडीआर का एक और प्रतिलिपि बनाने करता है जब आरडीआर में पारित हो जाता है, या यह एक ही आरडीआर कि पहले से ही साथ-ओपन बाध्यकारी द्वारा बनाई गई है की ओर इशारा करते है?

और क्या यह जांचने का कोई तरीका है कि दो क्लोजर इंस्टेंस एक ही मेमोरी को इंगित कर रहे हैं या नहीं?

"पॉइंटिंग टू" और "इंस्टेंस" जैसे मेरे बुरे शब्दों के बारे में खेद है, मैं क्लोजर में नौसिखिया हूं और अभी भी इसे सीख रहा हूं। :-)

उत्तर

5

क्लोजर जावा की तरह पास-बाय-वैल्यू है। मैं इसके बारे में सोचता हूं, संदर्भ मूल्य से पारित होते हैं। क्लोजर इस तरह काम करने के लिए यह खिंचाव नहीं है, योजना और सामान्य लिस्प एक ही तरीके से व्यवहार करते हैं।

आप दो संदर्भ identical? के साथ एक ही स्मृति को इंगित है कि क्या परीक्षण कर सकते हैं:

टेस्ट

(समान xy?) अगर ऐसे 2 तर्कों का उद्देश्य एक ही कर रहे हैं

+0

(समान?) बहुत आसान दिखता है, अब मैंने एक और चाल सीखी है! :-) –

4

this question on google groups के उत्तर के अनुसार यह मूल्य से गुजरता है।

क्लोजर जावा से तर्क-गुजरने वाले अर्थशास्त्र प्राप्त करता है। तो यह पास-दर-मूल्य है, जहां पारित मूल्य एक ऑब्जेक्ट संदर्भ है। इसके अलावा अनुकूलन सुविधाएं भी हैं जो आदिम-टाइप किए गए मानों को पार करने में सक्षम बनाती हैं।

तो पैरामीटर पारित होने पर फ़ंक्शंस प्रतिलिपि नहीं बनाते हैं। आपके कोड में rdr एक ही उदाहरण होगा।

जावा इंटरऑपरेबिलिटी के कारण इसे लागू करने के लिए समझ में आता है - अन्यथा आप जावा ऑब्जेक्ट्स को अपनी विधि के साथ संशोधित नहीं कर सकते हैं।

आप इसे आसानी से परीक्षण कर सकते हैं:

testvalue 
nil 

हैं barm की अपनी एक प्रतिलिपि बनाई है, तो printlnbar अंदर सौंपा मूल्य मुद्रित नहीं होगा: में

(import 'java.util.HashMap) 
(def m (new HashMap)) 
(defn foo [m] (defn bar [m] (.put m "testkey" "testvalue")) (bar m) (println (get m "testkey"))) 

(foo m) 

परिणाम।

+0

अपने जवाब के लिए धन्यवाद भी! :- डी –

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