جا داره یه تشکر کامل از دوستم استاد اشکان کنم که این آموزش برگرفته از این آموزش آقا اشکان هست از پرشین کدرز هست
فرض کنید یک تابعی نوشتیم بنام new . میدونیم که برای اجرا باید علامت تابع که پرانتز هست رو باید بزاریم . یعنی اگه بنویسیم
کد:new()
تابع اجرا میشه و اگه مقدار بازگشتی ای داشته باشه ، برگردونده میشه (مثلا اگه عدد رو برگردونه ، نوع بازگشتی اش عددی میشه) که تا اینجا همه مون میدونیم ولی اگه این پرانتز رو نزاریم ، یعنی هر جا نام فقط new بدون پرانتز رو ببریم ، مشخصه که نوع بازگشتی اش کل تابع (منظور مقدار بازگشتی این تابع که برای مثال عدد بود ، نمیشه دیگه) هست
کد:function new() return 5 end Dialog.Message("Notice", type(new()), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
و
کد:function new() return 5 end Dialog.Message("Notice", type(new), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
حالا اگه وقتی طبق تابع new در بالا (که عدد رو برمیگردون) متغییری رو برابرش بگیریم :
کد:func = new()
مشخصه که چون تابع new اجرا شد پس مقدار بازگشتی اش که عدد هست رو برمیگردونه یعنی new() برابر عدد میشه پس متغییر func هم همون نوع عددی هست ولی توی کد زیر :
کد:func = new
چون تابع اجرا نشد ، پس new کل تابع رو برمیگردونه یعنی هم new و هم متغییر func از نوع تابع یا function هستن
یک کاربرد این قضیه برای زمانی هست که بخوایم عملکرد یک تابع رو تغییر بدیم . مثلا اگه ماژول یا همون تابع Dialog.Message و هر تابع دیگه ای رو که خیلی توی پروژه استفاده کرده باشید و اگه بخاین تغییری توی کل این تابع بدین (مثلا متن نوار عنوان شو عوض کنین یا یه چیزی بهش اضافه کنین و هر تغییر دیگه ای) باید کل و به تعداد همون توابعی که توی پروژه استفده کردین ، تک تک و دونه دونه باید آرگومان ها رو تغییر بدین که کار بسیار دشواری هست .
با این روش میتونین عملکرد تابع (که قبلا نوشته شده . حالا چه خودمون نوشتیم یا در AMS نوشته شده و حتی توابع لوا) رو تغییر بدین .
اولا که چون برای ویرایش تابع قبلی ، هم به این نیاز داریم که یه تابع دیگه هم نام همون تابع ایجاد کنیم و هم به اینکه در بدنه ی این تابعی که همنام با توابع تابع مورد نظرمون هست ، نام همون تابع رو فراخونی کنیم و از طرفی هم فراخونی یک تابع به این روش باعث ارور میشه لذا باید قبل از همه چیز برای فراخونی تابع مورد نظر ، ازش در یک متغییر دیگر کپی (بکاپ) گرفت یعنی توی یه متغییر دیگه ریخت به همون روش بالا و متغییر پشتیبان گرفته شده رو توی بدنه ی تابعی که میخوایم ویرایش کنیم ، فراخونی کنیم :
این کد رو توی Global Function بزارید :
کد:function new() return 5 end
و اینو توی رویداد On Click یه دکمه :
کد:func = new Dialog.Message("Notice", type(new), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); old_new=new function new() return old_new().." salam" end Dialog.Message("Notice", new(), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);






پاسخ با نقل قول
Bookmarks