تعريف الدوال بأسلوب Lambda Expressions عادةً ما يستخدم عند استخدام دالة تحتوي على باراميتر عبارة عن دالة أخرى.
في درس الحاويات الديناميكية ( STL ) و بالتحديد حين شرحنا كيفية التعامل مع الكلاس forward_list
قمنا باستخدام دالة إسمها remove_if()
و قلنا أن هذه الدالة يجب أن نمرر لها دالة أخرى عند استدعائها حتى نحدد كيف سيتم حذف العناصر من الكائن.
ملاحظة: يجب أن تراجع ذلك الدرس جيداً مع قراءة جميع الأمثلة الموضوعة فيه حتى تفهم ما سيتم شرحه الآن.
في ذاك الدرس و بالتحديد في المثال الخامس, قمنا بتعريف الدالة shouldBeRemoved()
و من ثم تمريرها للدالة remove_if()
كالتالي.
// shouldBeRemoved() هكذا قمنا بتعريف الدالة bool shouldBeRemoved(const int& value) { if (value > 3) { return true; } return false; } .. .. // remove_if() و هكذا قمنا بتمريرها للدالة myList.remove_if(shouldBeRemoved);
إذاً ما فعلناه وقتها هو أننا قمنا بتعريف دالة عادية إسمها shouldBeRemoved()
و مررناها للدالة Lambda Expressions و لكننا الآن سنقوم بإعادة نفس الكود السابقة و تعريف نفس الدالة السابقة بأسلوب Lambda Expressions مع تمريرها بشكل مباشر للدالة remove_if()
كالتالي.
myList.remove_if( [](const int& value) { if (value > 3) { return true; } return false; });
الآن إذا كنا سنعيد نفس المثال الخامس مع التركيز فقط على تمرير Lambda Expressions للدالة remove_if()
فسيكون الكود كالتالي.
مثال
#include <iostream> #include <forward_list> using namespace std; int main() { // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس forward_list<int> my= {1, 3, 2, 4, 2, 5, 1, 5}; // remove_if() لحذف جميع العناصر التي تستوفي الشرط الذي مررناه بين أقواس الدالة myمن الكائن remove_if() هنا قمنا باستدعاء الدالة // Lambda Expression لاحظ أننا قمنا بتمرير نفس الدالة التي قمنا بتمريرها في المثال في السابق و لكن بأسلوب remove_if() بين أقواس الدالة myList.remove_if( [](const int& value) { // لإعلام المترجم أنه يجب حذف العنصر من الكائن الذي قام باستدعائها true هنا قلنا أن أي عنصر تكون قيمته أكبر من 3 سترجع الدالة if (value > 3) { return true; } // لإعلام المترجم أنه يجب عدم حذف العنصر من الكائن الذي قام باستدعائها false في حال لم تكن قيمة العنصر أكبر من 3 سيتم إرجاع القيمة return false; }); cout << "values = "; // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن for (auto it = myList.begin(); it != myList.end(); ++it) { cout << *it << " "; } return 0; }
سنحصل على النتيجة التالية عند التشغيل.
values = 1 3 2 2 1