ارسال متغیر به تابع با مرجع یا Reference در اکشن 3

++Hadi++

Active Member
سلام
ما در C++ می تونستیم یه متغیر رو به دو صورت به یه تابع بفرستیم :
1- با مقدار
2- با مرجع یا رفرنس
در حالت اول وقتی متغیر داخل تابع می رفت و اونو به روش زیر تغییر می دادیم ، هیچ تغییری در اصل متغیر ایجاد نمی شد :
PHP:
int a=1;
ChangeFun(a);
cout<<a<<endl;//OutPut:1
void ChangeFun(int NewNumber)
{
     NewNumber=10;
}
ولی وقتی همونو با این روش می فرستادیم ، در واقع اونو با مرجع و اصلش وارد تابع می شد و می تونستیم اونو کلا عوض کنیم :
PHP:
int a=1;
ChangeFun(a);
cout<<a<<endl;//OutPut:10
void ChangeFun( int$  NewNumber)
{
     NewNumber=10;
}
در واقع در روش دوم ، آدرس اشاره گر یا در واقع خونه حافظه این متغیر در ورودی تابع کچی می شد و می تونستیم ، اونو از بیس عوض کنیم .
البته یه استثنائی در مورد آرایه ها بود و این بود که اگه آرایه رو به روش اول ارسال می کردین ، می تونستین به صورت مستقیم مقادیر خونه های اونو عوض کنین و در واقع واسه تغییر مقدار خونه های آرایه نیازی به ارسال مرجع آرایه نیست .چرا؟
چون آرایه خودش یه اشاره گره .
حالا همین روش در اکشن به سبک های متنوع امکانپذیره .
من امروز دنبال این روش در اکشن 3 بودم و اونو پیدا کردم و گفتم براتون بنویسم .
اول این دستور رو در فلش و اکشن 3 اجرا کنید :
PHP:
var i:int=1;
ChangeFun(i);
trace(i);//output:1
function ChangeFun(num:int):void
{
   num=10;
}
خوب دیدین که متغیر عوض نشد چون اونو با مقدار فرستادیم .برای اینکه بتونیم یه متغیر رو با مرجع به تابع اکشن 3 بفرستیم تا اونو عوض کنین باید از آرایه یا از Object استفاده کنیم .
به اینجا توجه کنید :
PHP:
var i:Array=[1,2,3,4,5];
ChangeFun(i);
trace(i);//output:100,2,3,4,5
function ChangeFun(num:Array):void
{
   num[0]=100;
}
می بینین که ر اینجا ، آرایه رو تونستیم مستقیما عوض کنیم .
و حالا کار نهایی که خواستم بهتون آموزش بدم :
PHP:
var objVar:Object = {x:10, y:15}; 
objVar.z=20;
trace("First Time : ",objVar.x, objVar.y,objVar.z); // 10 15 
passByRef(objVar); // 11 16 
trace("Final Trace: ",objVar.x, objVar.y,objVar.z); // 11 16
function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    objParam.z++;
    trace("In Function: ",objParam.x, objParam.y,objParam.z); 
}
یعنی کافیه متغیراتونو رو یه Object تعریف و داخل تابع ببرین تا بتونین اونو به صورت مرجع عوض کنین ...
موفق باشید ...
 

armanbm

کاربر VIP
ممنون هادی جان.
در تکمیل پست شما بگم.
من به صورت تجری متوجه شدم تمام ساختمان داده ها و .. در اکشن اسکریپت به صورت اشاره گری به حافظه ی مربوطه هستند بجز ساختمان داده های اولیه مثل int , long, nomber , string,.... که مقدار خودشونه.
البته من تو dictunary وhash table حضور ذهن ندارم اما بنظرم اونا هم به صورت اشاره گرن.
اشاره گر به خونه ی حافه ای که اطلاعات مربوزه ذخیره شده.
واین میتونه داده ی زائد تو حافظه ایجاد کنه...
 

جدیدترین ارسال ها

بالا