C++ 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 و لاحظ كيف أننا وضعنا قوسين بعد إسم المتغير كما نستدعي الدالة العادية بالضبط.

مثال

Main.cpp
#include <iostream>

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 و هي عادةً ما تستخدم لهذا الهدف بالتحديد, حيث أنك ستتعلم منه كيفية تمرير الدالة كباراميتر لدالة أخرى لحظة تعريفها.

شاهد الأمثلة »

الدورات

أدوات مساعدة

الأقسام

دورات
مقالات أسئلة مشاريع كتب