توابع String ها :
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
این آموزش برای قسمت توابع هایی که مربوط به string هاست ، میشود . البته بجز توابع ای از string ها که به pattern ها مربوط میشوند که در آموزش قبلی به آن پرداختیم یعنی در این آموزش به توابع string.find و string.format و string.gmatch و string.gsub و string.match و حتی تابع string.sub که قبلا در بحث pattern ها به آنها پرداختیم ، نمیپردازیم
1) تابع string.dump :
یکی از مهمترین توابع string هاست که تابع را به رشته ی دودویی تبدیل میکند
این تابع ، یک آرگومان آنهم از نوع تابع دریافت میکند (ورودی آن باید از نوع تابع باشد نه چیز دیگری) و به عنوان متغییر خروجی ، رشته ای دودویی یا همان باینری تحویل میدهد (رشته ی معمولی و قابل درک نیست)
** تذکر : خروجی این تابع یعنی رشته ی باینری ، بعدا میتواند توسط تابع loadstring تبدیل به تابع شود (هر چند رشته ی باینری باشد) یعنی این دو تابع ، معکوس هم کار میکند
****تذکر مهم 2) : اگر آرگومان و ورودی رشته ی loadstring هم خودش یک تابع دیگر در آن تعریف شده باشد ، برای مقدار دهی آرگومان هایی که در این رشته هست ، موقع فراخوانی نام تابعی که با تابع loadstring تعریف شد ، باید مستقیما به خود نام تابع loadstring این آرگومان ها را بدهیم تا آرگومان های این تابع را به عنوان آرگومان های تابع داخلی آن ست کند
مثال 1 )
در آرگومان خط ششم یعنی در آرگومان تابع string.dump ، خوب نمیخواهیم تابع Func را اجرا کنیم پس نباید آرگومان های این تابع که y و a هستند را در این خط فراخوانی کنیم پس فقط ذکر نام تابع کافی است . بنابراین string.dump ، تابع Func را در ورودی گرفته و آنرا بصورت رشته ی باینری در متغییر FuncStrBinary ذخیره میکند لذا در خط هفتم این تابع بصورت رشته ی باینری (نه رشته ی معمولی) چیزی شبیه رشته ی زیر درمیاید :کد:function Func(y,a) x=(y+a)^2 return x end FuncStrBinary = string.dump(Func) Dialog.Message("Notice", FuncStrBinary, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
کد:"<-LuaQ"
2) تابع loadstring :
هر چند این تابع در لیست توابع string ها نیست و در قسمت توابع basic function هاست ولی چون تابع بسیار کاربردی در مبحث رشته هاست ، همین جا توضیح داده میشود
این تابع ، رشته ای (چه رشته ی باینری یا رشته ی معمولی) را به عنوان ورودی دریافت میکند و به عنوان خروجی ، آنرا (رشته ای که به عنوان ورودی دریافت کرده را) در قالب یک تابع ارائه میدهد (یعنی خروجی آن یک تابع هست)
یعنی انگار ورودی آنرا در قالب تابعی که آن نام آن تابع ، همان نام خروجی آن است ، تعریف کردیم برای درک بهتر ، حتما به مثال ها دقت کنید
مثال 2)
به توضیح خط اول خوب دقت کنید :کد:Func = loadstring("i=3") FuncCalled = Func() Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
الان که در خط اول این مثال که نوشته شد :
آرگومان آن که رشته ی "i = 3" هست را در قالب تابعی بنام Func (متغییر خروجی آن) تعریف میکند یعنی این آرگومان و رشته را به عنوان بدنه ی تابع Func تعریف میکند . یعنی دقیق این خط معدل آن اسن که بجای این خط بنویسیم :کد:Func = loadstring("i=3")
و هیچ فرقی با هم ندارند . به بدنه ی تابع در کد بالا دقت کنید که بصورت رشته نیست (که بدیهی است)کد:function Func() i = 3 end
یعنی در هر دو جا ، تابع تعریف میشود ولی فراخوانی نمیشود (همانطور که میدانیم برای اجرای تابع ، باید ابتدا فراخوانی شود)
حالا برای درک بهتر که در همین مثال شماره ی 2 ، در خط دوم و سوم آن چه میگذرد و چرا به این شیوه هست ، تابع جایگزین آنرا که در کد بالا نوشتیم ، بجای خط اول مثال شماره ی دوم مینویسیم :
همانطور که میبینید ، خط دوم و سوم آن مثل مثال شماره 2 هستکد:function Func() i = 3 end FuncCalled = Func() Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
همانطور که گفته شد ، خط اول در مثال شماره ی 2 یعنی
یا 3 خط اول در کد بالا یعنیکد:Func = loadstring("i=3")
، بدین معناست که در هر دو جا ، تابع تعریف شد ولی فراخوانی نشد (همانطور که میدانیم برای اجرای تابع ، باید ابتدا فراخوانی شود) بنابراین برای اجرای این توابع نیاز هست که فراخوانی شود که در خط دوم از مثال دوم (یا همان خط پنجم از کد بالا که شبیه هم هستند) ، تابع Func را فراخوانی کردیم (همانطور که میدانیم علامت فراخوانی تابع ، پرانتز است که جلوی Func در این خط میبینید) پس با فراخوانی تابع Func ، متغییر i (که مقدارش برابر 3 هست) ، هم که در بدنه ی این تابع وجود داشت ، تعریف شد و آنرا در متغییر FuncCalled قرار دادیم (دقت کنید که چون تابع Fun هیچ مقداری را برنمیگرداند پس متغییر FuncCalled هم حاوی مقداری نیست)کد:function Func() i = 3 end
در خط بعدی یعنی در خط آخر هم مقدار متغییر i را که با فراخوانی تابع Func تعریف شد ، چاپ میکنیم
مثال 3)
خط اول که آرایه ی بدون عضو تعریف شدکد:t={} loadstring("t[1]=2")() Dialog.Message("Notice", t[1], MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
خط دوم همان مثل مثال قبل است منتها بجای اینکه مثل مثال قبل که تابع را در خط اول که تعریف کرد و در خط دوم آنرا فراخوانی کند ، در این مثال هر دو کار را در یک خط انجام داد یعنی بالافاصله بعد از تعریف ، آنرا اجرا کرد . معادل تابع معمولی خط دوم در این مثال هم همان قضیه ی تابع بی نام میشود که در آموزش های قبلی (آموزش نکاتی درباره ی توابع لوا) توضیح داده شد . یعنی بجای خط دوم در این مثال میتوان این گونه نوشت :
حتما به توابع بی نام در آموزش "نکاتی درباره ی توابع" مراجعه کنیدکد:(function () t[1]=2 end)()
پس در خط دوم ، با اجرای این تابع بی نام ، اولین عضو آرایه ی t هم تعریف شد و در خط بعدی ، این عضو چاپ شد
مثال 4)
همانطور که میدانید ، خط سوم برابر است با تابع زیر :کد:i=4 x= i^2 Func = loadstring("return "..x) FuncCalled = Func() Dialog.Message("Notice", FuncCalled, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
دقت کنید که در خط سوم مثال 4 یعنی در این خط :کد:function Func() return x end
بعد از نوشتن گزینه ی return به عنوان رشته ، بعد از آن حتما یک space بگذارید . بعد رشته را بسته و بعد هم متغییر x را به آن بچسبانید . اگر آن کاراکتر space را نگذارید و به صورت رشته ی :کد:Func = loadstring("return "..x)
بنویسید مثل آن میماند که کد زیر هم همین کار را کرده و بنویسید :کد:"return"..x
که مشخص است آنرا به عنوان کلمه ی کلیدی return نشناخته و به عنوان یک متغییر میشناسد در تابعکد:function Func() returnx end
در خط چهارم در مثال 4 ، هم همانطور که میدانیم ، تابع Func را اجرا کرده و مقدارش را در متغییر FuncCalled میریزیم و چون تابع Func مقداری را برمیگرداند (مقدار x را) پس همان مقدار در متغییر FuncCalled ذخیره میشود و در خط آخر هم فراخوانی میشود
مثال 5)
در خط اول ، تابع loadstring ، تابع بی نام ای را تعریف و آنرا اجرا میکند ، بنابراین متغییر d با مقدار 99 تعریف و مقداردهی میشودکد:loadstring("d=99")() loadstring([[Dialog.Message("Notice", d, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);]])()
در خط بعدی هم شبیه همین ساختار است و تابعی است که مقدار متغییر d را که قبلا تعریف شده بود را چاپ میکند منتها بخاطر نوع سینتک تابع Dialog.Message نمیشود آنرا در رشته ای که سینتکس " " دارد تعریف کرد پس آنرا در رشته ای که سینتکس [[ ]] دارد تعریف میکنیم (همانطور که میدانید رشته ها را در دو سینتکس " " و [[ ]] میشود تعریف کرد که دومی سینتکس کامل تر و قدرتمندتر و هم برای رشته های یک خطی و چند خطی استفاده میشود)
مثال 6)
تابع string.dump در خط سوم ، تابع Func را به رشته ی باینری تبدیل میکندکد:function Func(y,a) x=(y+a)^2 return x end FuncStrBinary = string.dump(Func) FuncOfFunction = loadstring(FuncStrBinary) FuncVariable = FuncOfFunction(5,3) Dialog.Message("Notice", FuncVariable, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
تابع loadstring در خط بعدی ، رشته ی باینری FuncStrBinary را در قالب تابع FuncOfFunction تعریف میکند (همانطور که گفته شد ، آرگومان تابع loadstring فرقی نمیکند که رشته ی معمولی باشد یا رشته ی باینری)
همانطور که قبلا گفته شد ، موقع فراخوانی نام تابعی که با تابع loadstring تعریف شد (یعنی موقع فراخوانی تابع FuncOfFunction که در خط هشتم یعنی یک خط مانده به خط آخر انجام گرفت) اگر آرگومان و ورودی رشته ی loadstring (یعنی رشته ی FuncStrBinary در خط هفتم) هم خودش یک تابع دیگر در آن تعریف شده باشد (رشته ی FuncStrBinary که حاوی تابع Func هست) ، برای مقدار دهی آرگومان هایی که در این رشته هست (برای مقدار دادن آرگومان های تابع Func) ، باید مستقیما به خود نام تابع loadstring (یعنی تابع FuncOfFunction) این آرگومان ها را بدهیم تا آرگومان های این تابع را به عنوان آرگومان های تابع داخلی آن ست کند
لذا هر چند تابع FuncOfFunction آرگومانی ندارد ، ولی برای مقداردهی آرگومان داخلی آن باید به همین تابع ، این آرگومان ها را نسبت داد تا آرگومان های تابع داخلی مقداردهی شود پس در خط مقادیر دلخواه آرگومان های تابع FuncOfFunction را میدهیم (که همان آرگومان های تابع Func هست) و چون تابع ، مقداری را برمیگرداند لذا آن مقدار در متغییر FuncVariable ذخیره میشود (در این مثال مقدار FuncVariable برابر 64 میشود) و در خط آخر چاپ میشود
این مثال چون بصورت رشته ی باینری هست ، نمیشود مثل مثال های قبل ، تابع loadstring اش را بصورت تابع جداگانه نوشت
3) تابع tostring :
این تابع ، هر داده ای را به عنوان ورودی دریافت و بصورت رشته بازمیگرداند (البته توابع را بصورت عدد که در تابع string.format استفاده میشود ، برمیگرداند)
مثال 7)
متغییر Bool را که مقداری بولین دارد ، بصورت رشته بازمیگرداندکد:Bool = true FuncStr = tostring(Bool) Dialog.Message("Notice", FuncStr, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
بقیه ی توابع قسمت string در Autoplay Media Studio معادل دارند و فقط نام معادل آن ذکر میشود و توضیح ای ارائن نمیشود که عبارتند از :
تابع string.byte که معادل تابع String.Asc در AMS هست
تابع string.char که معادل تابع String.Char در AMS هست
تابع string.len که معادل تابع String.Length در AMS هست
تابع string.lower که معادل تابع String.Lower در AMS هست
تابع string.rep که معادل تابع String.Repeat در AMS هست
تابع string.reverse هم رشته را معکوس میکند و تقریبا معادل با تابع String.ReverseFind در AMS هست
تابع string.upper که معادل تابع String.Upper در AMS هست






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