تعبيرات Lambda مع المعاملات
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 43 من 56.
الآن بعد أن فهمت بناء جملة lambda الأساسي، لنقم بجعل lambdas أكثر فائدة من خلال إضافة المعلمات (parameters). تماماً مثل الدوال العادية، يمكن لـ lambdas قبول قيم إدخال للعمل معها.
لإضافة معاملات إلى تعبير لامدا (lambda)، ضعها داخل الأقواس بعد جملة الالتقاط (capture clause):
auto addNumbers = [](int a, int b) {
std::cout << "Sum: " << (a + b) << std::endl;
};
addNumbers(5, 3); // يطبع: Sum: 8تعمل صيغة المعلمات تماماً مثل معلمات الدوال العادية - حيث تقوم بتحديد النوع متبوعاً باسم المعلمة. يمكنك الحصول على معلمات متعددة مفصولة بفاصلات، تماماً كما هو موضح أعلاه.
يمكنك أيضاً استدعاء lambda مع معاملات مباشرة دون تخزينها:
[](int x, int y) {
std::cout << "Product: " << (x * y) << std::endl;
}(4, 7); // يطبع: Product: 28إن هذه القدرة على قبول المعاملات (parameters) تجعل دوال لامبدا (lambdas) أكثر مرونة وقابلية لإعادة الاستخدام، مما يتيح لك إنشاء دوال صغيرة يمكنها معالجة قيم مدخلات مختلفة في كل مرة يتم استدعاؤها فيها.
التحدي
سهلقم بإنشاء برنامج يوضح تعبيرات لامبدا (lambda expressions) مع المعاملات من خلال بناء آلة حاسبة بسيطة تقوم بعمليات رياضية مختلفة. سيختبر هذا التحدي فهمك لكيفية تعريف تعبيرات لامبدا التي تقبل قيم الإدخال وتعمل معها.
سيتم توفير المدخلات التالية:
- عددان صحيحان
num1وnum2يمثلان الأرقام المستخدمة في الحسابات - حرف
operationيمثل العملية الحسابية المراد تنفيذها
يجب على برنامجك القيام بما يلي:
- إنشاء تعبير لامبدا باسم
addيأخذ معاملين صحيحين ويطبع مجموعهما بالتنسيقSum: [result] - إنشاء تعبير لامبدا باسم
subtractيأخذ معاملين صحيحين ويطبع الفرق بينهما بالتنسيقDifference: [result] - إنشاء تعبير لامبدا باسم
multiplyيأخذ معاملين صحيحين ويطبع حاصل ضربهما بالتنسيقProduct: [result] - قراءة الرقمين وحرف العملية من المدخلات
- بناءً على حرف العملية، قم باستدعاء تعبير لامبدا المناسب مع الرقمين
سيكون حرف العملية واحداً مما يلي:
+للجمع (استدعاء لامبداadd)-للطرح (استدعاء لامبداsubtract)*للضرب (استدعاء لامبداmultiply)
استخدم تنسيق المخرجات الدقيق التالي بناءً على العملية:
للجمع:
Sum: [result]للطرح:
Difference: [result]للضرب:
Product: [result]تذكر أن معاملات لامبدا يتم تعريفها داخل الأقواس بعد جملة الالتقاط (capture clause)، باستخدام نفس صيغة معاملات الدوال العادية. قم بتخزين كل لامبدا في متغير باستخدام الكلمة المفتاحية auto، ثم استدعِ اللامبدا المناسبة بناءً على حرف العملية المدخل باستخدام جملة if-else أو جملة switch.
ورقة مرجعية
يمكن لتعبيرات Lambda قبول المعاملات عن طريق وضعها داخل أقواس بعد جملة الالتقاط (capture clause):
auto addNumbers = [](int a, int b) {
std::cout << "Sum: " << (a + b) << std::endl;
};
addNumbers(5, 3); // يطبع: Sum: 8تعمل صيغة المعاملات تماماً مثل معاملات الدوال العادية - حدد النوع متبوعاً باسم المعامل. يتم الفصل بين المعاملات المتعددة بفاصلات.
يمكنك أيضاً استدعاء lambda مع المعاملات مباشرة دون تخزينها:
[](int x, int y) {
std::cout << "Product: " << (x * y) << std::endl;
}(4, 7); // يطبع: Product: 28جرّب بنفسك
#include <iostream>
using namespace std;
int main() {
// قراءة المدخلات
int num1, num2;
char operation;
cin >> num1 >> num2 >> operation;
// TODO: إنشاء تعبيرات لامدا لعمليات الجمع والطرح والضرب
// TODO: استخدام جملة if-else أو switch لاستدعاء تعبير لامدا المناسب بناءً على العملية
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات4الخرائط (أزواج مفتاح-قيمة)
مقدمة إلى std::mapإنشاء خريطةالوصول إلى القيم وتعديلهاالتحقق من وجود المفاتيححذف الأزواجالتكرار عبر الخريطةمراجعة - تكرار الكلمات7الدوال المتقدمة
التمرير بالمرجعمقدمة في تعبيرات Lambdaتعبيرات Lambda مع المعاملاتتعبيرات Lambda مع قيم الإرجاعمقدمة في الاستدعاء الذاتيالمضروب بالاستدعاء الذاتيالفرز باستخدام Lambda2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector