25-05-17, 06:57 PM
بسم الله الرحمن الرحيم
بمناسبة قدوم شهر رمضان اعاده الله على الجميع بكامل الخير و البركةو جعلنا و اياكم من عتقائه من النار , و تقبل منا و منكم صالح الاعمال
احببت ان اقدم هذه المقالة المبسطة عن تعبيرات لامبدا (Lambda Expressions)
السلام عليكم و رحمة الله و بركاته
لا يخفى على الكثير من المبرمجين مدى قوة هذا الاسلوب و فاعليته في العمل البرمجي اذ انه يختصر عليك الكثير من الجهد و الوقت في كتابة الكود و يجعله اكثر قابلية للقراءة و اكثر وثوقية وقوة من قبل المترجم.
و بالعودة الى تاريخ هذا الاسلوب على ما اذكر كانت بدايته مع Java 8 , ثم جاءت #C و سرقت هذا الاسلوب او قلدته (لا يهم كثيراً , كله في مصلحتنا) , و على راي المثل السرقة من السارق ؟؟؟؟ ,جاءت Swift و سرقت من الاثنين , و اخيراً فيما قرأت جاءت لغة قوقل الجديدة Kotlin و سرقت من Swift و هكذا دواليك .
ببساطة Lambda Expressions هي دالة او اجراء بدون اسم يمكن استخدامه حيث اعتدنا استخدام Delegate
و يمكن ان ياتي بسطر واحد او اكثر من سطر
و يمكن ان يحتوي على بارمترات (ليس كل الانواع)
عملية انشائها سهلة و بسيطة حسب ما اعتدنا
عبر الكلمتين Function او Sub مثلما اعتدنا في عملنا مع الدوال او الاجراءات
بعد ذلك تاتي البارمترات
و بعدها ياتي جسم الدالة (الوظيفة المناطة بها)
ملاحظة: عندما تكون الدالة بسطر واحد لا نحتاج عندها الى (End Sub او End Function)
اما اذا كانت اكثر من سطر فنحتاج عندها الى الكلمات السابقة
مثال: دالة بسطر و احد مع طريقة الاستدعاء
PHP كود :
Dim Sum1 = Function(p) p + 1
MsgBox(Sum1(5))
PHP كود :
Dim sum2 = Function(p)
Return p + 2
End Function
MsgBox(sum2(5))
كما و يمكنك انشاء الدالة مع استدعائها بسطر واحد فقط كما يلي:
PHP كود :
MsgBox((Function(P As Integer) P + 1)(5))
ملاحظة : لا يمكنك تحديد نوع الدالة اذا كانت من النوع الاول (ذات السطر الواحد) , بينما يمكنك ذلك مع دالة تحتوي اكثر من سطر
و المقصود بتحديد النوع هو نوع الارجاع كما يلي:
PHP كود :
Dim sum2 = Function(p) As Integer
Return p + 2
End Function
MsgBox(sum2(5))
نفس الكلام ينطبق على الاجراءات او كما يحب البعض تسميتها بالروتين
مثال:
PHP كود :
Dim ShowMsg1 = Sub(S) MsgBox(S)
ShowMsg1("Welcome...")
Dim ShowMsg2 = Sub(S)
MsgBox(S)
End Sub
ShowMsg2("Welcome again...")
تمرير Lambda Expression كوسيط (بارميتر) ضمن الاجراءات و الدوال التي تقبل وسائط من النوع Delegate
لكي نفهمها اكثر ناخذ هذا المثال
PHP كود :
Sub Test(ByVal value As Integer, ByVal Fun As Func(Of Integer, Boolean))
If Fun(value) Then
MsgBox("Success")
Else
MsgBox("Failure")
End If
End Sub
اما وظيفة الدالة فهي تعيد Success في حال كانت True او Failure في حال كانت False
اما تطبيقها فياتي وقت الاستدعاء كما يلي
PHP كود :
Test(4, Function(num) num Mod 2 = 0)
و لاعادة النتيجة Failur يمكنك استخدامها كما يلي
PHP كود :
Test(5, Function(num) num > 10)
صيغة (Lambda Expression Syntax)
- Lambda Expression ليس لها اسم
- Lambda Expression لا يمكن التصريح عنها بالطرق التالية (OverLoads ,Overrides)
- Lambda Expression ذات السطر الواحد لا يمكن ان تكون لها نوع كما سبق ذكره ,بينما يمكن ان يكون لها نوع اذا كانت متعددة الاسطر.
- Lambda Expression ذات السطر الواحد لا تحتوي على (End Function ,End Sub) , و العكس صحيح.
- Lambda Expression لا يمكنك استخدام البارمترات الاختيارية وفق الكلمة (Optional) , كما لا يمكنك استخدام البرامترات من النوع (ParamArray) , و كذلك الانواع (Generic) .
-بالشكل العام اذا احتوت الدالة على نوع ارجاع صريح يتم التعامل معه , و الا سيتم الاستدلال على النوع من خلال القيمة العائدة اذا لم تحتوي الدالة على نوع ارجاع ,وهناك ما يعرف بالنوع المهيمن في حال كنت تتعامل مع مصفوفات تحتوي على عدة انواع من البيانات , كمثال على ذلك اذا كنت تتعامل مع مصفوفة رقمية تحتوي على ارقام عادية و عشرية فان النوع المهيمن و الذي يستوعب باقي الانواع سيكون من النوع Double كونه اكثر مرونه وقابلية للتوسع و استيعاب الارقام الاخرى.
-اذا كانت الدالة من النوع ذو السطر الواحد فيجب ان تعيد قيمة معها .
لم ينتهي الحديث هنا و مازال لدى هذا الاسلوب المتقدم الكثير من الامور الواجب عرضها و مناقشتها ... باذن الله
يتبع.....
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال