මෙය ආවරණය කරන විශිෂ්ට පිළිතුරු දැනටමත් තිබේ. බෙදාහදා ගැනීමෙන් කුඩා දායකත්වයක් ලබා දීමට මට අවශ්ය වියC ++ හි Pass-by-reference සහ Java හි Pass-by-value අතර හැසිරීම් අතර වෙනස ඉතා සරල උදාහරණයක් (සම්පාදනය කරනු ඇත) .
කරුණු කිහිපයක්:
- “යොමුව” යන පදය වෙනම අර්ථ දෙකක් සහිත අධික බරකි. ජාවාහි එය හුදෙක් දර්ශකයක් අදහස් කරයි, නමුත් "පාස්-බයි-යොමු" සන්දර්භය තුළ එයින් අදහස් වන්නේ සම්මත වූ විචල්යයට හසුරුවීමයි.
- ජාවා යනු පාස්-බයි-අගයයි . ජාවා යනු සී (වෙනත් භාෂා අතර) පැවත එන්නෙකි. C ට පෙර, FORTRAN සහ COBOL වැනි පෙර භාෂා කිහිපයක් PBR සඳහා සහය දැක්වූ නමුත් C එසේ නොකළේය. පීබීආර් මෙම අනෙකුත් භාෂාවන්ට උප චර්යාවන් තුළ සම්මත විචල්යයන් වෙනස් කිරීමට ඉඩ ලබා දුන්නේය. එකම දේ ඉටු කිරීම සඳහා (එනම් ශ්රිත තුළ විචල්යයන්ගේ අගයන් වෙනස් කිරීම), සී ක්රමලේඛකයෝ විචල්යයන් වෙත විචල්යයන් වෙත යොමු කළහ. ජාවා වැනි සී විසින් දේවානුභාවයෙන් ලියන ලද භාෂා මෙම අදහස ණයට ගත් අතර සී මෙන් ක්රමවේදයන් වෙත යොමු කිරීම දිගටම කරගෙන යයි. නැවතත්, මෙය "යොමු කිරීම" යන වචනයට වඩා "යොමු කිරීම" යන වචනයේ වෙනස් භාවිතයකි.
- "&" අක්ෂරය භාවිතා කරමින් යොමු පරාමිතියක් ප්රකාශ කිරීමෙන් සී ++ මඟින් පාස්-බයි-යොමු කිරීමට ඉඩ දෙයි (එය සී සහ සී ++ යන දෙකෙහිම "විචල්යයක ලිපිනය" දැක්වීමට භාවිතා කරන එකම අක්ෂරයම වේ). උදාහරණයක් ලෙස, අපි යොමු කිරීමකින් දර්ශකයකින් ගමන් කරන්නේ නම්, පරාමිතිය සහ තර්කය එකම වස්තුවකට යොමු නොවේ. ඒ වෙනුවට ඒවා එකම විචල්යයයි. යමෙකු වෙනත් ලිපිනයකට හෝ ශුන්යයට සකසා ඇත්නම්, අනෙකා ද එසේ කරයි.
- පහත දැක්වෙන C ++ උදාහරණයේ දී මම යොමු කිරීමක් මඟින් ශුන්ය අහෝසි කරන ලද නූලකට යොමු කරමි . පහත දැක්වෙන ජාවා උදාහරණයේ දී මම ජාවා යොමු කිරීමක් නූලකට යොමු කරමි (නැවතත්, නූලකට දර්ශකයක් ලෙස). අදහස් දැක්වීමේ ප්රතිදානය සැලකිල්ලට ගන්න.
යොමු උදාහරණයෙන් C ++ සමත් වීම:
using namespace std;
#include <iostream>
void change (char *&str){ // the '&' makes this a reference parameter
str = NULL;
}
int main()
{
char *str = "not Null";
change(str);
cout<<"str is " << str; // ==>str is <null>
}
අගය උදාහරණයකින් ජාවා සමත් "ජාවා යොමු කිරීමක්"
public class ValueDemo{
public void change (String str){
str = null;
}
public static void main(String []args){
ValueDemo vd = new ValueDemo();
String str = "not null";
vd.change(str);
System.out.println("str is " + str); // ==> str is not null!!
// Note that if "str" was
// passed-by-reference, it
// WOULD BE NULL after the
// call to change().
}
}
සංස්කරණය කරන්න
කිහිප දෙනෙක් අදහස් ලියා ඇති අතර එයින් පෙන්නුම් කරන්නේ ඔවුන් මගේ උදාහරණ දෙස නොබලන බවයි. එසේ නැතහොත් ඔවුන්ට c ++ උදාහරණය නොලැබෙන බවයි. විසන්ධි වන්නේ කොහේදැයි විශ්වාස නැත, නමුත් c ++ උදාහරණය අනුමාන කිරීම පැහැදිලි නැත. මම එකම උදාහරණය පැස්කල්හි පළ කරමි, මන්ද යත්, පාස්-බයි-යොමු කිරීම පැස්කල්හි වඩා පිරිසිදු යැයි සිතන නමුත් මම වැරදියි. මම මිනිසුන්ව තව තවත් ව්යාකූල කරනවා විය හැකිය; මම බලාපොරොත්තු නොවෙමි.
පැස්කල් වලදී, යොමු කරන ලද පරාමිතීන් "var පරාමිතීන්" ලෙස හැඳින්වේ. පහත දැක්වෙන setToNil ක්රියාපටිපාටියේ, කරුණාකර 'ptr' පරාමිතියට පෙර 'var' යන පදය සටහන් කරන්න. අවධානය යොමුකළ මෙම ක්රියාවලිය සඳහා ගමන් කරන විට, එය සම්මත කර ගනු ඇත සඳහනක් විසින් . හැසිරීම සැලකිල්ලට ගන්න: මෙම ක්රියා පටිපාටිය ptr nil ලෙස සකසන විට (එය NULL සඳහා පැස්කල් කතා), එය තර්කය නිල් ලෙස සකසනු ඇත - ඔබට එය ජාවා හි කළ නොහැක.
program passByRefDemo;
type
iptr = ^integer;
var
ptr: iptr;
procedure setToNil(var ptr : iptr);
begin
ptr := nil;
end;
begin
new(ptr);
ptr^ := 10;
setToNil(ptr);
if (ptr = nil) then
writeln('ptr seems to be nil'); { ptr should be nil, so this line will run. }
end.
සංස්කරණය 2
කෙන් ආර්නෝල්ඩ්, ජේම්ස් ගොස්ලිං (ජාවා නිර්මාණය කළ පුද්ගලයා) සහ ඩේවිඩ් හෝම්ස්, 2 වන පරිච්ඡේදයේ, 2.6.5 කොටසෙහි "ජාවා ක්රමලේඛන භාෂාව" වෙතින් උපුටා ගත් කොටස්
ක්රම සඳහා වන සියලුම පරාමිතීන් "අගය අනුව" සම්මත වේ. වෙනත් වචන වලින් කිවහොත්, ක්රමයක පරාමිති විචල්යයන්ගේ අගයන් තර්ක ලෙස දක්වා ඇති ඉන්වොකර්ගේ පිටපත් වේ.
ඔහු වස්තූන් සම්බන්ධයෙන් එකම කරුණක් ඉදිරිපත් කරයි. . .
ඔබ පරාමිතිය වස්තුවක් යොමු වන විට, එය, වස්තුව යොමු-නොවන වස්තුව බව ම-බව කරුණාවෙන් යුතු "වටිනාකම" සම්මත .
එම කොටසේම අවසානය දක්වා ඔහු ජාවා ගැන පුළුල් ප්රකාශයක් කරන්නේ වටිනාකමින් පමණක් වන අතර කිසි විටෙකත් එය යොමු නොකරයි.
ජාවා ක්රමලේඛන භාෂාව යොමු කිරීමෙන් වස්තු පසු නොකරයි; එය
අගය අනුව වස්තු යොමු කරයි . එකම යොමුවෙහි පිටපත් දෙකක් එකම සත්ය වස්තුවකට යොමු වන හෙයින්, එක් යොමු විචල්යයක් හරහා සිදු කරන ලද වෙනස්කම් අනෙකා හරහා දැකිය හැකිය. හරියටම එක් පරාමිතියක් පසුකරන මාදිලියක් ඇත- අගය අනුව ගමන් කරන්න - සහ දේවල් සරල ලෙස තබා ගැනීමට උපකාරී වේ.
පොතේ මෙම කොටසේ ජාවාහි පරාමිති සම්මත කිරීම සහ පාස්-බයි-රීෆරන්ස් සහ පාස්-බයි-අගය අතර වෙනස පිළිබඳව විශාල පැහැදිලි කිරීමක් ඇති අතර එය ජාවාහි නිර්මාතෘ විසිනි. ඕනෑම කෙනෙකුට එය කියවීමට මම උනන්දු කරවන්නෙමි, විශේෂයෙන් ඔබට තවමත් ඒත්තු ගැන්වී නොමැති නම්.
මා සිතන්නේ මාදිලි දෙක අතර වෙනස ඉතා සියුම් වන අතර ඔබ සැබවින්ම පාස්-බයි-යොමු කිරීම භාවිතා කළ වැඩසටහන්කරණය කර නොමැති නම්, මාදිලි දෙකක් වෙනස් වන තැන මග හැරීම පහසුය.
මෙය විවාදය සමථයකට පත් කරනු ඇතැයි මම බලාපොරොත්තු වෙමි, නමුත් බොහෝ විට එසේ නොවනු ඇත.
සංස්කරණය 3
මම මේ පෝස්ට් එක ගැන ටිකක් උමතු විය හැකිය. ජාවා නිෂ්පාදකයින් නොදැනුවත්වම වැරදි තොරතුරු පතුරුවා හරින බව මට හැඟෙන නිසා විය හැකිය. දර්ශකයන් සඳහා “යොමු” යන වචනය භාවිතා කරනවා වෙනුවට ඔවුන් වෙනත් දෙයක් භාවිතා කර තිබේ නම්, ඩිංගල්බෙරි කියන්න, කිසිදු ගැටළුවක් ඇති නොවනු ඇත. ඔබට කිව හැකිය, "ජාවා ඩිංගල්බෙරි පසු කරන්නේ වටිනාකමින් මිස යොමු කිරීමකින් නොවේ", කිසිවෙකු ව්යාකූල නොවනු ඇත.
ජාවා සංවර්ධකයින්ට පමණක් මේ සම්බන්ධයෙන් ගැටළුවක් ඇත්තේ එයයි. ඔවුන් "යොමු කිරීම" යන වචනය දෙස බලා එහි තේරුම හරියටම දන්නා බව සිතයි, එබැවින් ඔවුන් විරුද්ධ තර්කය සලකා බැලීමට පවා කරදර වන්නේ නැත.
කෙසේ වෙතත්, මම පැරණි පෝස්ට් එකක අදහස් දැක්වීමක් දුටුවෙමි, එය බැලූන් ප්රතිසමයක් සෑදූ අතර එය මා සැබවින්ම කැමති විය. කෙතරම්ද යත්, කාරණය නිදර්ශනය කිරීම සඳහා කාටූන් කට්ටලයක් සෑදීම සඳහා ක්ලිප්-ආර්ට් කිහිපයක් මැලියම් කිරීමට මම තීරණය කළෙමි.
අගය අනුව යොමු කිරීමක් සම්මත කිරීම - යොමු කිරීම වෙනස් කිරීම අමතන්නාගේ විෂය පථය තුළ පිළිබිඹු නොවේ, නමුත් වස්තුවෙහි වෙනස්කම් වේ. මෙයට හේතුව යොමු කිරීම පිටපත් කර ඇති නමුත් මුල් පිටපත සහ පිටපත යන දෙකම එකම වස්තුවකට යොමු වීමයි.
යොමු කිරීම හරහා ගමන් කරන්න - යොමු පිටපතක් නොමැත. තනි යොමු කිරීම අමතන්නා සහ කැඳවනු ලබන ශ්රිතය යන දෙකම බෙදා ගනී. යොමුකිරීමේ හෝ වස්තුවේ දත්තවල යම් වෙනසක් ඇමතුම්කරුගේ විෂය පථය තුළ පිළිබිඹු වේ.
සංස්කරණය 4
මෙම මාතෘකාව පිළිබඳ ලිපි මම දැක ඇත්තෙමි, එය ජාවා හි පරාමිති සම්මත කිරීම අවම මට්ටමක ක්රියාත්මක කිරීම විස්තර කරයි, එය වියුක්ත අදහසක් සංයුක්ත කරන බැවින් එය විශිෂ්ට සහ ඉතා ප්රයෝජනවත් යැයි මම සිතමි. කෙසේ වෙතත්, මට ප්රශ්නය වන්නේ භාෂාවේ පිරිවිතරයේ විස්තර කර ඇති හැසිරීම පිළිබඳ හැසිරීම හැසිරීමේ තාක්ෂණික ක්රියාත්මක කිරීම ගැන ය. මෙය ජාවා භාෂා පිරිවිතර, 8.4.1 වගන්තියේ උපුටා ගැනීමකි :
ක්රමවේදය හෝ ඉදිකිරීම්කරු ආයාචනා කළ විට (§15.12), සත්ය තර්ක ප්රකාශනයේ අගයන් ක්රමයේ හෝ ඉදිකිරීම්කරුගේ ශරීරය ක්රියාත්මක කිරීමට පෙර අලුතින් සාදන ලද පරාමිති විචල්යයන්, ප්රකාශිත එක් එක් වර්ගය ආරම්භ කරයි. විධිමත් පරාමිතිය වෙත යොමු කිරීම සඳහා DeclaratorId හි ඇති හැඳුනුම්පත ක්රමයේ හෝ ඉදිකිරීම්කරුගේ ශරීරයේ සරල නමක් ලෙස භාවිතා කළ හැකිය.
එහි තේරුම, ක්රමයක් ක්රියාත්මක කිරීමට පෙර ජාවා විසින් සම්මත කරන ලද පරාමිතීන්ගේ පිටපතක් නිර්මාණය කිරීමයි. විද්යාලයේ අවස්තා අධ්යයනය කළ බොහෝ මිනිසුන් මෙන්, මම භාවිතා "එන්ටර් ද ඩ්රැගන් 'පොත" වන THE අවස්තා පොත. 1 වන පරිච්ඡේදයේ "ඇමතුම් අනුව අගය" සහ "ඇමතුම අනුව-යොමු කිරීම" පිළිබඳ හොඳ විස්තරයක් එහි ඇත. ඇමතුම් අනුව අගය විස්තරය ජාවා පිරිවිතර සමඟ හරියටම ගැලපේ.
90 දශකයේ දී මම සම්පාදකයින් හැදෑරූ විට, මම 1986 සිට පොතේ පළමු සංස්කරණය භාවිතා කළ අතර එය ජාවාට අවුරුදු 9 ක් හෝ 10 ක් පමණ කලින් නියම කර ඇත. කෙසේ වෙතත්, මම 2007 සිට 2 වන සංස්කරණයේ පිටපතක් හරහා දිව ගියෙමි , එහි ඇත්ත වශයෙන්ම ජාවා ගැන සඳහන් වේ! 1.6.6 වගන්තියේ “පරාමිති පසු කිරීමේ යාන්ත්රණයන්” යනුවෙන් ලේබල් කර ඇති පරාමිතිය ඉතා හොඳින් ගමන් කිරීම විස්තර කරයි. ජාවා ගැන සඳහන් වන "කෝල්-බයි-අගය" යන මාතෘකාව යටතේ උපුටා ගැනීමක් මෙන්න:
ඇමතුම අනුව, සත්ය පරාමිතිය ඇගයීමට ලක් කෙරේ (එය ප්රකාශනයක් නම්) හෝ පිටපත් කිරීම (එය විචල්යයක් නම්). අගය කැඳවනු ලබන ක්රියාපටිපාටියේ අනුරූප විධිමත් පරාමිතියට අයත් ස්ථානයේ තබා ඇත. මෙම ක්රමය සී සහ ජාවා වල භාවිතා වන අතර එය සී ++ හි මෙන්ම වෙනත් බොහෝ භාෂාවලද පොදු විකල්පයකි.