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 الكامل بالعربي.