فانکشن بدون پرانتز در دارت
سلام به فلاتری های عزیر و همراهان Flutter Challenge.
اگه وقتی که داری یه function رو بدون پرانتز به جایی پاس میدی گیج و سردرگم میشی و نمیدونی که داره چه اتفاقی میوفته تا آخر این مقاله رو با دقت بخون و بعدش با اعتماد به نفس از این تکنیک استفاده کن و به بقیه هم یاد بده.
توی این مقاله ی کوتاه میخوایم در مورد function ها در Dart صحبت کنیم ولی نه در مورد همه نکاتش بلکه فقط میخوایم ببینیم چرا بعضی جاها یه function رو بدون پرانتز به کار میبریم و اصلن چه اتفاقی پشت پرده میوفته وقتی که یه function رو بدون پرانتز استفاده میکنیم و یا وقتی پرانتز براش میذاریم اون پشت مشتا چه اتفاقی میوفته.
خلاصه میخوایم بریم و ته و توی این قضیه رو دربیاریم. پس با این مقاله جذاب تا آخر همراه باش....
قبل از پرداختن به اصل موضوع چندتا نکته بهتون بگم.
توی Dart همه class ها از کلاس Object ارث بری میکنن :
شاید بپرسی class چه ربطی به function داره؟ همراهم باش تا آخر مقاله که بفهمی.
خب اینجوری بگم که توی Dart یه class داریم به اسم Object که پایه و اساس همه class های دیگه هست و همه class ها (به جز Null) از این class ارث بری میکنن.
بریم یه مثال بزنیم که متوجه بشی...
کد بالا رو ببین, یه variable از جنس int تعریف کردم و بعدش دو تا print گذاشتم و با استفاده از دستور is گفتیم که ایا این variable از جنس int و Object هست؟
خروجی رو ببین:
میبینی جواب هر دو شده Yes. چون که همون طور که گفتم توی Dart همه کلاس ها از جمله int از Object ارث بری میکنن.
یا مثال زیر رو ببین :
پس فهمیدیم که توی Dart همه class ها به جز Null از Object ارث بری میکنن.
Callable class :
میدونیم که هر class تشکیل شده از یک سری field و method.
- Instance Fields
- Static Fields
- Instance methods
- Static methods
حالا یه method خاص داریم با یه اسم خاص. اگه توی یه class یه method ای بسازیم که اسمش call باشه یه اتفاقات خاصی میوفته.
کلاس بالا رو ببین که یه method به اسم call داره.در مورد این method بگم که:
- نوع مقدار بازگشتیش مهم نیست, یعنی میتونه void باشه یا هر چیز دیگه...(هر چی دوست داشتی)
- آرگومان های ورودیش هم مهم نیست و میتونه هیچ آرگومانی نگیره و یا هر چی دلت خواست براش قرار بدی.
- فقط اسمش مهمه که حتمن call باشه.
حالا چه اتفاقی میوفته ؟
توی کد بالا خیلی ساده یه نمونه از کلاسم ساختم و بعدش هم متد call رو صدا زدم.
همه چی واضحه...نه؟
حالا کد زیر رو ببین:
توی کد بالا یه اتفاق جالب افتاد. خیلی جالب.
دو تا پرانتز گذاشتم ته myService و متد call اجرا شد!!!
دیدی؟
وقتی که توی یه class یه متدی داشته باشیم که اسمش call باشه میتونیم با گذاشتن پرانتز ته variable ساخته شده از اون class اون method رو اجرا کنیم. به این class ها میگن Callable class.
اینم یه مثال دیگه:
توی Dart حتا Function هم یک class هست :
این جمله خیلی سنگین بود ولی الان تحلیلش میکنیم.
توی کد بالا یه function تعریف کردم.
چه اتفاقی داره میوفته؟
کد زیر رو ببین:
اینجا یه دونه String تعریف کردم. وقتی اینو تعریف میکنیم چی داره میشه ؟
در واقع یه نمونه از کلاس String ساخته میشه و توی حافظه قرار میگیره(توی یکی از خونه های حافظه یا رم) و بعد این variable که اینجا اسمش رو گذاشتیم str رفرنس اون خونه از حافظه رو توی خودش نگه میداره درواقع str اشاره میکنه به یه خونه از حافظه که داخلش یه نمونه از کلاس String ذخیره شده.
حالا کد بالا رو دوباره ببین :
اینجا وقتی که یه function تعریف میکنم هم باید یه چیزی توی حافظه ذخیره بشه دیگه...نه؟ همین جوری الکی که نمیشه؟ باید یه چیزی ذخیره بشه؟ نباید بشه؟ باید بشه.
ولی چی ذخیره میشه و چه جوری ؟
توی Dart یه کلاسی داریم به اسم Function.
وقتی که یه function تعریف میکنم مثل کد زیر :
خود Dart میاد و اون پشت یه کارایی میکنه.
یه کاری شبیه به این انجام میده. نه دقیقن مثل این ها. ولی برای اینکه متوجه بشید کد بالا رو در نظر بگیرید.
جناب Dart میاد و یه class درست میکنه و میگه که Function رو implements کن. و بعد یه method با اسم call توش میذاره و بدنه ی این method دقیقن کپی همون function هست که ما نوشتیم.
حالا Dart میاد و میگه :
پس ما یه Function نوشتیم :
ولی پشت پرده یه اتفاق های دیگه افتاد :
پشت پرده کدی که ما نوشتیم به صورت بالا تفسیر میشه.
در واقع یه class نوشته میشه که از جنس Function class هست و براش یه method به اسم call قرار داده میشه و بعدش یه نمونه از اون class ساخته میشه و اون نمونه رو میریزه توی .... توی چی میریزه؟
توی یه variable با اسمی که ما برای function گذاشتیم.
پس وقتی که یه function به صورت زیر تعریف میکنیم :
یه callable class از جنس Function class ساخته میشه و ازش یه نمونه ساخته میشه و اون نمونه میره توی حافظه ذخیره میشه حالا ما یه variable داریم به اسم myFunction که داره اشاره میکنه به اون خونه از حافظه.
پس وقتی که داریم یه function تعریف میکنیم انگار هیچ فرقی با وقتی نداره که داریم یه variable معمولی مثل String تعریف میکنیم.
پس ما الان یه variable داریم به اسم myFunction که داره رفرنس یه خونه از حافظه رو داخل خودش نگه میداره که اون خونه از حافظه داخلش یه نمونه از یه callabe class ذخیره شده.
پس با توجه به مفهوم callable class ها میتونیم با گذاشتن دو تا پرانتز ته این variable یعنی myFunction باعث اجرا شدن متد call اون class بشیم که همون بدنه ی function ای هست که ما تعریف کردیم.
پس همون طور که یه variable از جنس String یا یه variable از هر جنس دیگه ای رو میتونیم به جاهای مختلف پاس بدیم این جا هم myFunction که در واقع یه variable هست رو میتونیم به جاهای مختلف پاس بدیم و این میشه که میگن داری function رو بدون پرانتز پاس میدی و هر موقع که ته اون variable پرانتز بذاری اون call اجرا میشه.
حالا مثال زیر رو هم ببین:
میبینی که یه function تعریف کردم و بعدش برای اجرا کردنش به جای اینکه ته variable مورد نظر یعنی myFunction پرانتز بذارم روش call رو صدا زدم وباز هم function اجرا شد که این هم از همه حرفایی که تا الان زدیم به خوبی میشه نتیجه گرفت.
و به عنوان نکته آخر همون طور که گفتیم همه class ها توی Dart از Object ارث بری میکنن از جمله Function class.
پس :
امیدوارم که از این مقاله لذت برده باشی.
مطلبی دیگر از این انتشارات
داستان Null در دارت(دادگاه رسیدگی به اتهامات دارت-2)
مطلبی دیگر از این انتشارات
Dart Const (استفاده در فلاتر)
مطلبی دیگر از این انتشارات
Dart Const (const constructor)