تعرف على كيف يمكن أن تجعل Lambdas شفرتك أكثر كفاءة وأسهل في الصيانة.
تتطور لغات البرمجة باستمرار ، حتى تلك اللغات مثل C ++ التي أسست نفسها منذ فترة طويلة. يضيفون وظائف إلى المكتبات القياسية ويقومون بإجراء تغييرات أخرى لتسهيل مهمة المبرمجين العاملين في مجال ديناميكي.
كجزء من التحديثات التي أحدثها تطور اللغة ، أضاف C ++ دعمًا لتعبيرات lambda في إصداره 2011.
ما هو تعبير لامدا بالضبط ، وكيف يمكنك استخدامه لصالحك كمبرمج C ++؟
ما هو تعبير لامدا؟
يُعرف تعبير لامدا أيضًا باسم دالة لامدا. إنه تعبير مضمن مع القدرة على قبول الوسائط وتنفيذ العمليات وإرجاع قيمة ، تمامًا مثل وظيفة نموذجية.
يمكنك استخدام لامدا داخل دالة أخرى وإسنادها إلى متغير. دوال لامبا هي طريقة عملية لتعريف كائن دالة مجهولة في برنامج. تدعم كل لغة تقريبًا لغة lambdas ، على الرغم من اختلاف كل تطبيق عن الآخر.
ما هي أجزاء تعبير لامدا C ++؟
من السهل استخدام تعبيرات Lambda في لغة ++ C. يمكنك تفصيل بناء جملة تعبير lambda في C ++ على النحو التالي:
[capture_clause] (معلمات) خيارات {expression_body؛ }
فمثلا:
int فال = 13;
تلقاءي sumPlusVal = [val] (int أ، int ب) متقلبلا باستثناء ->int { إرجاع فال + أ + ب ؛ };
sumPlusVal (2, 5); // 20
يصرح هذا الرمز sumPlusVal متغير تلقائي لأن تعبير lambda يمكنه قبول أي نوع بيانات وإرجاعه. هذا يترك الأمر للمترجم لتحديد النوع أثناء التجميع.
من الكود أعلاه ، يمكنك أن ترى أن تعبير lambda يحتوي على عدة أجزاء تحدد كيفية عمله. إليك نظرة عامة سريعة على كل من هذه المكونات.
-
شرط الالتقاط: هذا هو الجزء الأول من تعبير lambda حيث يمكنك تحديد المتغيرات الموجودة مسبقًا أو تحديد متغيرات جديدة لاستخدامها في نص التعبير. هناك طرق مختلفة لتحديد الالتقاطات ، على سبيل المثال:
auto addTwo = [foo] () { إرجاع فو + 2; }; // بالقيمة
addThree تلقائي = [& شريط] () { إرجاع شريط + 3; }; // بالتزكية
addAllVal تلقائي = [=] () { إرجاع فو + بار ؛ }; // كل شيء بالقيمة
auto addAllRef = [&] () { إرجاع فو + بار ؛ }; // الكل بالإشارة// إنشاء متغير في عبارة الالتقاط
auto createVarInCapture = [fooBar = foo + bar] () { إرجاع fooBar * 5; };// لا يوجد التقاط - إرجاع الخطأ لأنه لا يمكن الوصول إلى foo
خطأ تلقائي في التعبير = [] () { إرجاع فو + 2; }; - المعلمات: هذا الجزء من تعبير لامدا اختياري أيضًا. يحتوي على معلمات الوظيفة المطلوبة بواسطة لامدا. لا يختلف هذا عن الطريقة المعتادة التي تحدد بها معلمات الوظيفة في C ++.
-
خيارات: يمكنك أيضًا تحديد الخيارات عند تعريف تعبير lambda. بعض الخيارات التي يمكنك استخدامها هي: متقلب, استثناء (على سبيل المثال لا باستثناء في نموذج الكود الأول) ، -> نوع الإرجاع (على سبيل المثال -> كثافة العمليات), يستوجب, صفات، إلخ. ال متقلب غالبًا ما يستخدم الخيار لأنه يسمح بالتعديل داخل لامدا. يوضح الكود أدناه هذا.
على الرغم من أنه نادرًا ما يتم استخدام الخيارات الأخرى ، يمكنك الحصول على مزيد من المعلومات عنها على cppreference.com صفحة على لامدا.int القيمة = 10;
// يُرجع خطأ - القيمة هي ثابت داخل التعبير
إنقاص تلقائي = [القيمة] () { إرجاع --القيمة؛ };
الزيادة التلقائية = [القيمة] () قابلة للتغيير { إرجاع ++ قيمة ؛ };
زيادة راتب()؛ // 11 - جسد التعبير: هذا هو جسم تعبير lambda الذي ينفذ ويعيد قيمة ، تمامًا مثل الوظيفة. إذا لزم الأمر ، يمكنك تقسيم جسم تعبير لامدا عبر أكثر من سطر واحد. ومع ذلك ، فمن أفضل الممارسات أن تجعلها مختصرة قدر الإمكان لمنع الشفرة غير المنظمة.
ما هي فوائد تعبيرات لامدا؟
هناك العديد من المزايا لاستخدام وظائف lambda في التعليمات البرمجية الخاصة بك. بصرف النظر عن زيادة سرعة التطوير والكفاءة ، فإن أهم الفوائد التي تحصل عليها من Lambdas هي كما يلي:
- تساعد تعبيرات Lambda في الحفاظ على الكود نظيفًا. واحدة من أفضل الطرق للحفاظ على الكود الخاص بك بسيطًا وأنيقًا هي استخدام Lambdas حيثما أمكن ذلك. يمكن أن يكون هذا مفيدًا جدًا في الحفاظ على بنية رمز قابلة للقراءة وقابلة لإعادة الاستخدام.
-
يمكنك تمرير لامدا إلى وظائف أخرى كمعلمات. ال مكتبة C ++ القياسيةالأمراض المنقولة جنسيا:: فرز () طريقة الاستفادة من هذه الميزة. يمكنك تمرير لامدا كواحدة من معلمات هذه الطريقة لتحديد كيفية قيام الوظيفة بالفرز. على سبيل المثال:
الأمراض المنقولة جنسيا:: ناقلات<int> arr = {2، 5، 1، 3، 4} ؛
std:: sort (arr.begin ()، arr.end ()، [] (int أ، int ب){ إرجاع أ // arr = {1، 2، 3، 4، 5} -
يمكن إعادة استخدام Lambdas. في بعض الأحيان ، قد ترغب في جعل كتلة من التعليمات البرمجية قابلة لإعادة الاستخدام في نطاق وظيفة في برنامجك دون الحاجة إلى تحديد وظيفة جديدة. يمكن أن يكون Lambdas مفيدًا جدًا في مثل هذه الحالات. ضع في اعتبارك المثال التالي لتعبير لامدا القابل لإعادة الاستخدام:
ينتج عن هذا البرنامج النتيجة التالية: يوضح هذا المثال مدى سهولة تعريف لامدا بحيث يمكنك استخدامها مع أي نوع.#تضمن <iostream>
استخدام مساحة الاسمالأمراض المنقولة جنسيا;intرئيسي(){
// تحديد لامدا قابلة لإعادة الاستخدام
auto addUp = [] (auto a، auto b، auto c) لا باستثناء {
كوت <<"جارٍ الإضافة الآن... "<< أ <<", "<< ب <<" و "<< ج << نهاية.
إرجاع أ + ب + ج ؛
};كوت << addUp (22 ، 33 ، 44) << نهاية.
كوت << addUp (سلسلة نصية ("سعيدة ")، سلسلة("ولادة")، سلسلة("يوم")) << نهاية.
cout << addUp (حقيقي, خاطئة, حقيقي) << std:: endl؛ // ينفذ كأرقام (1 و 0)
}
استخدام Lambdas في C ++
هناك العديد من المزايا الأخرى التي توفرها تعبيرات lambda ، وستكتشفها مع زيادة تعقيد بنية برنامجك. في الواقع ، يشير مبرمجو C ++ أحيانًا إلى تعبيرات lambda على أنها عمليات إغلاق لأنها طريقة رائعة لتنفيذ عمليات الإغلاق في التعليمات البرمجية.
يجب أن تفكر في تعبيرات lambda إذا كنت تريد دمج مفاهيم C ++ الحديثة في قاعدة التعليمات البرمجية الخاصة بك.