C++Lambda Expressions
- مفهوم الـ Lambda Expressions
- أساسيات التعامل مع Lambda Expressions
- أمثلة شاملة حول طرق تعريف Lambda Expressions
مفهوم الـ Lambda Expressions
إبتداءاً من الإصدر c++11
تم إضافة أسلوب جديد يمكن استخدامه لتقليل حجم الكود عند تعريف دوال جديدة.
الأسلوب الجديد الذي سنتعلمه في هذا الدرس لتعريف الدوال يقال له Lambda Expressions أو Closures أو Literals Function أو Lambdas فقط.
الشكل العامل لتعريف Lambda Expression
[captures] (parameters) -> returnTypesDeclaration { lambdaStatements; };
مكان الكلمة captures
يمكنك تمرير قيم متغيرات معرّفة خارج الدالة أو عناوينها فقط حتى تتمكن من الوصول إليها و التعامل معها من داخل الدالة مع الإشارة إلى أنه يجب وضع مربعين فارغين []
في حال لم ترد وضع بارامتيرات فيها.
مكان الكلمة parameters
يمكنك وضع بارامتيرات للدالة مع الإشارة إلى أنك تستطيع عدم وضع القوسين ()
من الأساس في حال لم ترد وضع بارامتيرات فيها.
مكان الكلمة returnTypesDeclaration
نمرر نوع القيمة التي سترجعها الدالة عندما يتم تنفيذها. هنا يستطيع المترجم على الأغلب معرفة ما سترجعه الدالة بشكل تلقائي في حال كانت تحتوي على أمر واحد فقط و لكن يفضّل دائماً أن تحدد نوع الإرجاع بنفسك.
مكان الكلمة lambdaStatements
نضع الأوامر التي نريدها أن تتنفذ عند استدعاء الدالة.
أساسيات التعامل مع Lambda Expressions
الدالة العادية نقوم بإعطائها إسم عند تعريفها و لاحقاً عندما نريد تنفيذها نقوم باستدعائها من خلال كتابة إسمها و هكذا سيفهم المترجم أننا نريد تنفيذها.
الدالة التي يتم تعريفها بأسلوب Lambda Expressions لا نعطيها إسم و لكننا نقوم بإسنادها لمتغير من نفس نوعها حتى نستدعيها من خلاله أون نجعل نوع المتغير الذي سيشير لها auto
حتى يتولى المترجم وضع النوع المناسب لهذا المتغير.
في المثال التالي قمنا بتعريف دالة لا تملك أي باراميتر بأسلوب Lambda Expressions.
عند تعريفها قمنا بإسنادها لمتغير إسمه lambda
و نوعه auto
حتى نتمكن لاحقاً من استدعائها من خلاله.
في الأخير قمنا باستدعاء الدالة بواسطة المتغير lambda
و لاحظ كيف أننا وضعنا قوسين بعد إسم المتغير كما نستدعي الدالة العادية بالضبط.
مثال
using namespace std; int main() { // يساويها حتى نستطيع لاحقاً استدعاءها من خلاله lambda و من ثم قمنا بتعريف متغير إسمه Lambda Expression هنا قمنا بتعريف دالة بأسلوب auto lambda = [] { cout << "My first lambda expression"; }; // و لاحظ أننا وضعنا قوسين بعده و كأننا نستدعي دالة عادية lambda هنا قمنا باستدعاء الدالة التي يشير لها المتغير lambda(); return 0; }
سنحصل على النتيجة التالية عند التشغيل.
My first lambda expression
الدالة التي قمنا بتعريفها في المثال السابق كان بإمكاننا تعريفها بعدة أشكال مختلفة و الحصول على نفس النتيجة تماماً.
فيما يلي سنعرض لك 5 طرق مختلفة كان يمكن اتباعها لتعريف الدالة التالية.
auto lambda = [] { cout << "My first lambda expression"; };
الطريقة الأولى: كان بإمكانك إضافة أقواس الباراميترات و تركها فارغة كالتالي.
auto lambda = []() { cout << "My first lambda expression"; };
الطريقة الثانية: كان بإمكانك وضع الكلمة void
بين القوسين مما يعني أنه لا يوجد بارامتيرات أيضاً كالتالي.
auto lambda = [](void) { cout << "My first lambda expression"; };
الطريقة الثالثة: كان بإمكانك تحديد أن الدالة لا ترجع قيمة بعد أن يتم تنفيذها, أي ذكر أن نوعها void
و هنا لا بد من وضع أقواس الباراميترات قبلها كالتالي.
auto lambda = []() void { cout << "My first lambda expression"; };
الطريقة الرابعة: كان بإمكانك وضع أقواس الباراميترات و بداخلها الكلمة void
بالإضافة لذكر أن الدالة نوعها void
أيضاً كالتالي.
auto lambda = [](void) void { cout << "My first lambda expression"; };
أمثلة شاملة حول طرق تعريف Lambda Expressions
المثال الأول
في المثال التالي ستتعلم كيفية وضع بارميترات لدالة معرّفة بأسلوب Lambda Expressions بالإضافة إلى استدعائها.
المثال الثاني
في المثال التالي ستتعلم كيفية تعريف دالة بأسلوب Lambda Expressions ترجع قيمة بالإضافة إلى استدعائها.
المثال الثالث
في المثال التالي ستتعلم كيفية تعريف دالة بأسلوب Lambda Expressions مع تمرير متغيرات خارجية لها بالإضافة إلى استدعائها.
المثال الرابع
في المثال التالي ستتعلم كيفية تعريف دالة بأسلوب Lambda Expressions مع تمرير عنواين متغيرات خارجية لها بالإضافة إلى استدعائها.
المثال الخامس
المثال التالي مهم جداً لأنه يعتبر الهدف الأساسي من ابتكار أسلوب Lambda Expressions و هي عادةً ما تستخدم لهذا الهدف بالتحديد, حيث أنك ستتعلم منه كيفية تمرير الدالة كباراميتر لدالة أخرى لحظة تعريفها.