توابعِ Scope در Kotlin

یکی از ویژگی‌های زبان کاتلین استفاده از توابع Scope در این زبان است ، این توابع با استفاده از Lambda به خوانایی و انسجام کدِ شما کمک می‌کنند ، کاری که به طورِ کلی این نوع توابع انجام می‌دهند گرفتن یک شئ و تشکیل یک بلاک برای اجرای کد هست . پنج تابعی که در این مقاله بررسی می‌کنیم به ترتیبِ زیر هستند :applyalsoletwithrunاین توابع رو میشه به چند حالت تقسیم بندی کرد اما قبل از اون یک مثال خیلی کلی از یکی از این توابع می‌زنیم : https://gist.github.com/sasssass/60a6e024ed00dde11911063f5f7603f7 در این کد ما از دو تابع apply و let استفاده کردیم ، اگر دقت کنید در مورد apply برای دسترسی به عناصرِ کلاس مستقیم اسم عنصر مورد نظر رو آوردیم اما برای let این کار رو نکردیم ، در ادامه این مقاله متوجه این تفاوت‌ها خواهید شد .تقسیم بندی بر اساس اشاره‌گر (ورودیِ خودِ لامبدا)همون طور که ابتدای مقاله گفتم ، این توابع به طور کلی یک بلاک از کد برای ما ایجاد می‌کنند که ما به نحوی به اون شئ دسترسی داریم ، یا مثل apply به صورت مستقیم یا مثل let به صورت غیرمستقیم و پارامتری ، سه تابع apply ، with و run به صورت مستقیم به شئ دسترسی دارند ، یعنی مثل کد بالا اگر به data1 نیاز داشتید بدون واسطه مستقیم اون رو صدا می‌زنید و در واقع اشاره‌گر this دیگه به کلاس Main اشاره نمی‌کنه بلکه به obj اشاره می‌کنه اما در let و also این طور نیست ، در این دو تابع پارامتر it در اختیار شما قرار می‌گیره (یا اگه دلتون بخواد اسمش رو هم می‌تونید عوض کنید) و شما با استفاده از این پارامتر باید به دیتاها دسترسی داشته باشید ، به کدِ پایین دقت کنید https://gist.github.com/sasssass/60a6e024ed00dde11911063f5f7603f7 همون طور که می‌بینید در apply به طور مستقیم و در let با استفاده از پارامتر به توابع دسترسی داریم . حالا این توابع رو بر اساس اشاره‌گر به دو دسته پارامتری و مستقیم تقسیم بندی می‌کنیم :دسته اول (مستقیم) : apply - run - withدسته دوم (پارامتری) : also - letتقسیم بندی بر اساس خروجیتوابع Scope به دو صورت خروجی می‌دهند (یعنی مثلا اگر var a = let گذاشته شود) یا خودِ شئ یا خروجی لامبدا ، اگر گیج شدید به مثال پایین دقت کنید :همون طور که می‌بینید variable1 از جنس خودِ کلاسِ Obj و Variable2 از جنسِ خروجی لامبدا (چیزی که تهِ لامبدا نوشتیم و با علامت ^ برای شما مشخص کرده) تعیین شده ، بر این اساس طبقه بندی توابع به این صورت خواهد بود :خودِ شئ را خروجی می‌دهند : apply - alsoخروجیِ لامبدا را خروجی می‌دهند : let - run - withتقسیم بندی بر اساس ورودیورودی‌ای که شما به این توابع می‌دهید دو حالت دارند ، یا به صورت پارامتر ورودی رو به تابع معرفی می‌کنید یا به همان صورت‌هایی که در مثال های بالا دیدید (در واقع به این قضیه receiver argument می‌گویند) پس در این دسته بندی with یک طرف و باقی یک طرف دیگر هستند ، به مثال پایین دقت کنید : https://gist.github.com/sasssass/eec7430e8680518e865baf0d1eb69bdd چگونگی استفادهحالا از هر کدوم از این توابع باید کی و کجا استفاده بشه ؟تابع apply :معمولا برای تغییر محتوا و انتساب اولیه از apply استفاده می‌شود : https://gist.github.com/sasssass/c23b0e3144f0b85e83002c01c10f674e تابع let :یکی از مهم ترین کاربرد‌‌های let بررسی null نبودن یک شئ است (به علامت سوال در کد دقت کنید) : https://gist.github.com/sasssass/4f486bd48c644d8558b16ea2ccf7e86d در کدِ بالا پیغام چاپ نمی‌شود زیرا کد‌های درون بلاک وقتی که obj برابر null باشد اجرا نمی‌شوند ، کاربرد دیگر برای خوانایی بهتر کد است (مثلا زمانی که اسم متغیر بزرگ است یا ... که اسم تبدیل به متغیر it بشود و ... .کابرد run :چون run از اشاره‌گر this استفاده کرده و خروجیِ لامبدا رو برمی‌گرداند بیشترین کاربردی که از اون دیدم خلاصه کردن کد و انتساب خروجی توابع و متغیرها به صورت‌های زیر بوده : https://gist.github.com/sasssass/4b70aa866e9145b562e147a447c8d9d4 همچنین برای چک کردن null نیز می‌توان از run استفاده کرد : https://gist.github.com/sasssass/696a40c08cc5f3023b2da47a0d342d07 کاربردهایی که ذکر کردم بیشتر چیزهایی بوده که در کدهای مختلف دیدم ، اما اگر به صورت کلی بخواهیم یک فلوچارت برای قضیه بکشیم باید توجه کنیم که ما دقیقا به چه نیاز داریم ، آیا به اشاره‌گر this نیاز داریم یا پارامتر it ؟ آیا نیاز داریم خروجی بلاک از جنسِ خودِ شئ باشد یا از جنسِ خروجی مشخص شده در لامبدا یا ... ، فلوچارت زیر که در نوشته‌ای پیدا کردم شاید بهترین مرجع باشد :من رو در لینکدین و اینستاگرام دنبال کنید ???اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???