تو این آموزش رسمی کتابی نوشته شد برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
1) بلاک ها (Block) :
در واقع هر شرط و حلقه و کلا هر چیزی که به کلمه ی کلیدی end ختم شود را میشود یک بلاک نامید
اما منظور ما در اینجا از بلاک ، شرط و ... نیست . ساختاری به این شکل است :
کد:do --body end
معمولا این نوع بلاک ، اغلب برای تعریف متغییر محلی بیشترین کاربرد را دارد.
2) متغییر محلی (local variable) :
متغییر محلی ، متغییری ست که اگر در بلاک ای تعریف شده باشد ، فقط تا پایان اجرای کدهای آن بلاک اعتبار دارد (تا پایان end) و در حافظه ی اصلی میماند و بعد از اتمام آن بلاک حذف میشود و اگر بلاکی تعریف نکنیم ، تا پایان اجرای آن رویداد باقی میماند
در واقع متغییر محلی 2 کاربرد اساسی دارد . اول برای مدیریت جزئی حافظه ی رم و دوم برای اینکه اگر شک داریم و نمیدانیم اسمی از متغییری را که به عنوان نام متغییر محلی که داریم مینویسیم ، جای دیگری بکار بردیم یا نه و کلا نگران اوررایت شدن آن متغییریم ، از متغییر محلی استفاده میکنیم
برای درک بهتر ، میتوانید این مثال را ببینید که در هر بلاک ، متغییر محلی ، فقط در همان بلاک اعتبار دارد (گویی برای هر متغییر محلی تا پایان آن بلاک ، فضای جداگانه در حافظه اختصاص داده میشود ، صرف نظر از متغییری با همان نام که قبلا ایجاد شده بود یا نه (و آیا این متغییر قبلا از نوع محلی بود یا سراسری) و بعد از اتمام آن پاک میشود) :
کد:do local loc=5 do local loc="x" do local loc=1589 Dialog.Message("Notice", loc, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end Dialog.Message("Notice", loc, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end Dialog.Message("Notice", loc, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end Dialog.Message("Notice", type(loc), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
البته متغییر محلی را میتوان به تابع یا آرایه ها هم اختصاص داد . مثلا در مثال های زیر که بخاطر بودن تابع و آرایه در یک بلاک و فراخوانی آنها در بلاکی دیگر ، ارور میدهند (بخاطر nil بودنشان) :
وکد:do local funct function funct(a) a=a+1 return a end end Dialog.Message("Notice", funct(1), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
کد:do local t={5,98} end Dialog.Message("Notice", t[2], MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
نکته ای که در متغییرهای محلی باید دقت داشت این است که اگر در بلاکی (هر بلاک و حلقه و ...) ، متغییر محلی ای تعریف کردیم و اگر در یک بلاک دیگر (مثل تابع) آن متغییر را فراخوانی کردیم ، اگر از قبل مقدار نداشت که nil میشود وگرنه به مقدار قبل خود بازمیگردد. مثال :
کد:function examp() Dialog.Message("Notice", type(loc), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end do local loc=4 examp() end
که در تابع examp ، متغییر loc که در بلاکی دیگر ایجاد شد اما از همان بلاک ، تابعی فراخوانی شده است که داخل آن تابع ، متغییر محلی بلاک دیگر فراخوانی شده است ، مقدارش nil است
با تشکر از تمام کسانی که در این آموزش سهیم بودند






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