تكرار السؤال: …
الإجابة المختصرة
تختلف في طريقة الإشارة للكائن (this أو it) وفي القيمة المعادة (الكائن نفسه Context Object أو نتيجة اللامدا Lambda Result).
الشرح
تُستخدم apply و also لتهيئة الكائن وتنفيذ آثار جانبية وتُعيد الكائن نفسه (Context Object)، حيث تستخدم apply الإشارة this بينما تستخدم also المعامل it. أما let و run و with فتُعيد نتيجة تعبير اللامدا؛ تُستخدم let مع it لفحص null والتحويل، و run مع this لتجميع العمليات وحساب قيمة، بينما with تأخذ الكائن كمعامل مستقل.
مثال بالكود
// apply: تهيئة الكائن وإرجاعه
val intent = Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse("https://developer.android.com")
}
// let: فحص null وتحويل النوع وإرجاع النتيجة
val length = text?.let { it.trim().length } ?: 0
// also: تنفيذ logging أو آثار جانبية وإرجاع الكائن
val user = createUser().also { log("User created: ${it.id}") }أخطاء شائعة
- تداخل أكثر من Scope Function بشكل معقد مما يجعل الكود غامضًا وصعب القراءة والصيانة.
- استخدام let فقط لفحص null عندما يكون if (x != null) أبسط وأوضح (لا فرق في الأداء لأن let دالة inline، والفرق في القراءة فقط).