2010-12-08 16 views
11

पैरामीटर पास करने वाली तकनीकों के बीच अंतर:कॉल-बाय-नेम और कॉल-बाय-रेफरेंस

मैं इन दो तकनीकों पर क्या एकत्र कर सकता हूं।

कॉल संदर्भ द्वारा:

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

'नाम से कॉल:

वास्तविक चर समारोह में पारित कर दिया जा रहा है। फ़ंक्शन के स्थानीय दायरे के अंदर चर के मान में कोई भी परिवर्तन फ़ंक्शन के बाहर भी दिखाई देगा।

ऐसा लगता है, ये दो पैरामीटर पास करने वाली तकनीकें एक ही चीज़ को पूरा करती हैं? वे दोनों मूल चर सामग्री पर कार्य करते हैं। क्या मेरी परिभाषा गलत है? क्या मैं गलत तरीके से इस बारे में सोच रहा हूं?

उत्तर

14

कॉल-बाय-नाम आपके वर्णन से थोड़ा अलग है। छद्म कोड में, कल्पना:

function foo(index, value-increment) 
    sum = 0 
    loop index = 1 to 3 
     sum = sum + value-increment 
    return sum 

x = 3 
foo(x, 1/x) 

यदि हमारे foo कॉल संदर्भ, दूसरा तर्क, 1/x द्वारा होता है, केवल एक बार हमें प्रभावी ढंग से दे रही है मूल्यांकन किया जाता है: 1/3 + 1/3 + 1/3। यह एक सख्त मूल्यांकन है - फ़ंक्शन लागू होने से पहले प्रत्येक तर्क का पूर्ण मूल्यांकन किया जाता है।

यदि हम नाम से कॉल करते हैं, तो 1/x का कड़ाई से मूल्यांकन नहीं किया जाता है। इसके बजाए, लूप में इसका मूल्यांकन किया जाता है क्योंकि इसकी आवश्यकता होती है। प्रभावी रूप से, लूप बन जाता है:

loop x = 1 to 3 
    sum = sum + 1/x 

या 1/1 + 1/2 + 1/3।

thunks पर एक नज़र डालें, हालांकि थंक्स का हमेशा कॉल-बाय-नाम नहीं होता है। हास्केल के पास thunks का विचार है लेकिन call-by-need का उपयोग करता है जहां 1/x का मूल्यांकन तब तक नहीं किया जाएगा जब तक इसकी आवश्यकता न हो, लेकिन फिर केवल एक बार मूल्यांकन किया जाएगा (उल्लेख नहीं किया गया है कि हास्केल में एक परिवर्तनीय लूप चर नहीं होगा)।

अन्य संसाधन:

+0

यह अभी तक इस (समान) प्रश्न मैं का सामना करना पड़ा करने के लिए सबसे अच्छा जवाब कर रहा है। –

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