تخطَّ إلى المحتوى

let / run / with / apply / also

دوال النطاق let / run / with / apply / also

خمس دوال قياسية تنفّذ كتلة كود على كائن دون تكرار اسمه، وتختلف في مرجع الكائن (it/this) والقيمة المُرجَعة.

let وrun وwith وapply وalso تسمح بتنفيذ كتلة كود في نطاق كائن معيّن. تنقسم لمجموعتين حسب مرجع الكائن داخل الكتلة: let وalso يستخدمان it، بينما run وwith وapply يستخدمان this ضمنيًّا. وتنقسم أيضًا حسب القيمة المُرجَعة: let وrun وwith تُرجع نتيجة آخر سطر في الكتلة، بينما apply وalso تُرجعان الكائن الأصلي نفسه — لذلك تُستخدمان بكثرة للتهيئة المتسلسلة (chaining).

الصياغة

كائن.let { it... }
كائن.also { it... }
كائن.apply { this... }
كائن.run { this... }
with(كائن) { this... }

📄 مثال

val result = mutableListOf(1, 2, 3)
    .also { println("القائمة الأصلية: $it") }   // it، يُرجع القائمة نفسها
    .let { it.map { n -> n * 2 } }                // it، يُرجع نتيجة جديدة

val report = StringBuilder().apply {
    append("النتيجة: ")   // this ضمنية
    append(result)
}.toString()   // apply يُرجع StringBuilder نفسه ثم toString() عليه

println(report)

أهم النقاط

العنصرالوظيفة
let (it, نتيجة)أمان null وسلسلة تحويلات — يُرجع نتيجة الكتلة
also (it, الكائن)تأثيرات جانبية (طباعة/تسجيل) دون كسر السلسلة
apply (this, الكائن)تهيئة أو إعداد كائن ثم إرجاعه
run (this, نتيجة)تهيئة كائن ثم حساب نتيجة منه
with (this, نتيجة)تجميع عدة نداءات على كائن موجود — ليست extension

💡 نصائح عملية

  • قاعدة سريعة: أردت إرجاع الكائن نفسه؟ استخدم apply/also. أردت نتيجة حساب؟ استخدم let/run/with
  • with تُستدعى بتمرير الكائن كمعامل: with(obj) { ... } — لا تُكتب بعد نقطة مثل الباقي

⚠️ أخطاء شائعة

  • استخدام apply بدل let لإرجاع نتيجة تحويل — apply يتجاهل ناتج الكتلة ويُرجع الكائن الأصلي دائمًا
  • تعشيش عدة دوال نطاق مع it بدون تسمية صريحة — يصعب معرفة أي it ينتمي لأي نطاق

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار KOTLIN الكامل بالعربي.