2013-04-05 5 views
7

द्वारा कॉल करें, मैं संदर्भ, मूल्य और नाम द्वारा कॉल के बीच वैचारिक अंतर को समझने की कोशिश कर रहा हूं।संदर्भ, मूल्य और नाम

तो मैं निम्नलिखित स्यूडोकोड है:

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

क्या है पहला, दूसरा, और foo कॉल के बाद जेड अगर ए, बी, और सी संदर्भ द्वारा सभी कॉल कर रहे हैं? यदि कोई, बी, और सी कॉल-दर-मूल्य/परिणाम हैं? यदि ए, बी, और सी कॉल-बाय-नाम हैं?

अन्य परिदृश्य:

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, X); 

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

+2

टैग पर होवर करें जो आपने अभी प्रश्न पर रखा है, और विवरण देखें। मैंने नाम से गुजरने के बारे में कभी नहीं सुना है, जब तक कि यह कुछ प्रकार का प्रतिबिंब नहीं है। –

+0

नाम से गुजरें: http://stackoverflow.com/questions/838079/what-is-pass-by-name-and-how-does-it-work-exactly –

+1

क्या आप जानते हैं कि कौन से पॉइंटर्स हैं? संदर्भ द्वारा उत्तीर्ण होने पर मूल्य से गुजरते समय एक सूचक पास हो रहा है, वह मूल्य को पार कर रहा है। – Pithikos

उत्तर

5

जब आप मान द्वारा पैरामीटर पास करते हैं, तो यह केवल फ़ंक्शन पैरामीटर के भीतर मान की प्रतिलिपि बनाता है और फ़ंक्शन के भीतर उस चर के साथ जो भी किया जाता है वह मूल चर को प्रतिबिंबित नहीं करता है

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 
//printing will print the unchanged values because variables were sent by value so any //changes made to the variables in foo doesn't affect the original. 
print X; //prints 1 
print Y; //prints 2 
print Z; //prints 3 

लेकिन जब हम संदर्भ द्वारा मानकों भेजने के लिए, यह प्रतियां चर जिनमें से पता मतलब है जो कुछ भी हम समारोह के भीतर चर के साथ करते हैं, वास्तव में जैसे मूल स्मृति स्थान पर किया जाता है

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

print X; //prints 2 
print Y; //prints 5 
print Z; //prints 52 

नाम से पास के लिए; Pass-by-name

+0

पास-बाय-रेफरेंस के लिए, पास की गई चीज़ एक अंतराल (यानी असाइन करने योग्य) होनी चाहिए। 'वाई + 2' एक लाभा नहीं है, इसलिए मुझे यकीन नहीं है कि इसका क्या मतलब होगा इसका मतलब भी होगा। – newacct

0

यह एक्स-वाई या जेड के मान को नहीं बदलेगा यदि यह पास-बाय-वैल्यू है। जब आप "foo()" जैसे फ़ंक्शन का उपयोग करते हैं, तो यह मूल रूप से चर (x, y और z) को अन्य चर (ए, बी, और सी) में प्रतिलिपि बनाता है और मूलभूत रूप से बदलने के बिना उनके साथ कुछ क्रियाएं करता है (x, वाई और जेड)। आप एक मूल्य बदलने के लिए आप इस तरह एक मूल्य के कुछ वापस जाने के लिए, होगा:

foo(a, b, c) 
{ 
a = a++; 
b = b++; 
c = a + b * 10; 
return c; 
} 

x = 1; 
y = 2; 
z = 3; 
z = foo(x, y+2) 
फिर

x और y एक ही होगा, लेकिन जेड होगा (x + 1) + (y + 1) * 10 जो इस मामले में 32 होगा।

1

मूल्य से - फ़ंक्शन में कोई बदलाव नहीं है। फ़ंक्शन समाप्त होने पर आपके सभी कार्य गायब हो जाते हैं।

संदर्भ से - आपके कार्य वास्तव में चर बदलते हैं। नाम से - मैंने कभी नहीं सुना है ...

पासिंग x + 1 को बदल नहीं है, बस कार्य करने के लिए कहता है 3 के बजाय 2 या आदि ...

0
जावास्क्रिप्ट में

:

  1. स्ट्रिंग की तरह आदिम प्रकार परिवर्तनीय, संख्या हमेशा के आधार पर पास होती है।
  2. ऐरे और ऑब्जेक्ट को संदर्भ के अनुसार पारित किया गया है या इन शर्तों के आधार पर मूल्य से गुजरता है।

    • अगर आपको लगता है कि वस्तु या नई वस्तु या सरणी के साथ सरणी के मूल्य बदल रहे हैं तो यह द्वारा मूल्य पारित किया गया है।

      object1 = {item: "car"}; array1=[1,2,3];

    यहाँ आप नई वस्तु बताए जाते हैं या array.you वर्ष की संपत्ति का मूल्य नहीं बदल रहे हैं object.so यह मूल्य से पास होना जरूरी है।

    • यदि आप किसी ऑब्जेक्ट या सरणी के गुण मान को बदल रहे हैं तो यह संदर्भ द्वारा पास किया जाता है।

      object1.item= "car"; array1[0]=9;

    यहाँ आप पुराने के एक संपत्ति के मूल्य बदल रहे हैं object.you वर्ष के लिए नई वस्तु या सरणी बताए नहीं कर रहे हैं one.so यह संदर्भ द्वारा पास होना जरूरी है।

कोड

function passVar(object1, object2, number1) { 

     object1.key1= "laptop"; 
     object2 = { 
      key2: "computer" 
     }; 
     number1 = number1 + 1; 
    } 

    var object1 = { 
     key1: "car" 
    }; 
    var object2 = { 
     key2: "bike" 
    }; 
    var number1 = 10; 

    passVar(object1, object2, number1); 
    console.log(object1.key1); 
    console.log(object2.key2); 
    console.log(number1); 

Output: - 
    laptop 
    bike 
    10 
2

द्वारा मूल्य कॉल: सामान्य तरीके से ... वास्तविक पैरामीटर के मान औपचारिक पैरामीटर को कॉपी कर रहे हैं।

संदर्भ द्वारा कॉल करें: पैरामीटर के बजाय, उनके पते पारित किए जाते हैं और औपचारिक पैरामीटर वास्तविक मानकों को इंगित कर रहे हैं।

नाम द्वारा कॉल करें: मैक्रोज़ की तरह, संपूर्ण फ़ंक्शन परिभाषा फ़ंक्शन कॉल को बदलती है और औपचारिक पैरामीटर वास्तविक पैरामीटर के लिए सिर्फ एक और नाम हैं।

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