لامبدا (Lambda)
توابع لامبدا یعنی «تابع های کوچولوی بی نام» داخل کد. سریع می نویسی و همان جا اجرا می کنی. مثل یادداشت چسبی روی دفتر، اما برای کد.
توابع لامبدا چیست؟
تابع بی نام یعنی نام ندارد و همان جا تعریف می شود. بنابراین برای کارهای کوتاه عالی است.
نمونه ساده
یک لامبدا پیام چاپ می کند و بعد آن را صدا می زنیم.
int main() {
auto message = []() {
cout << "Hello World!\n";
};
message();
return 0;
}
لامبدا با پارامتر
مثل تابع عادی، به لامبدا پارامتر می دهیم و مقدار برمی گردانیم.
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) {
return a + b;
};
cout << add(3, 4);
return 0;
}
ارسال لامبدا به تابع دیگر
می توانیم یک لامبدا را ورودی تابع کنیم تا آن تابع، کار دلخواه را انجام دهد.
#include <iostream>
#include <functional>
using namespace std;
void myFunction(function<void()> func) {
func();
func();
}
int main() {
auto message = []() {
cout << "Hello World!\n";
};
myFunction(message);
return 0;
}
نکته: برای <code>std::function</code> باید <functional> را اضافه کنی.
لامبدا داخل حلقه
می توانی داخل حلقه لامبدا بسازی و همان جا اجرا کنی.
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 3; i++) {
auto show = [i]() {
cout << "Number: " << i << "\n";
};
show();
}
return 0;
}
بخش capture در لامبدا
capture یعنی لامبدا به متغیرهای بیرون خودش دسترسی بگیرد. با [] نوع دسترسی را مشخص می کنیم.
کپی کردن مقدار (by value)
اینجا x به صورت کپی داخل لامبدا استفاده می شود.
int main() {
int x = 10;
auto show = [x]() {
cout << x;
};
show();
return 0;
}
نکته: بعداً اگر x بیرون تغییر کند، کپی داخل لامبدا عوض نمی شود.
ارجاع (by reference)
با [&] آخرین مقدار متغیر را می گیریم؛ یعنی خود متغیر.
int main() {
int x = 10;
auto show = [&x]() {
cout << x;
};
x = 20;
show();
return 0;
}
تابع عادی یا لامبدا؟
تابع عادی برای استفاده تکراری بهتر است. لامبدا برای کارهای کوتاه و یک باره عالی است.
تابع عادی
int add(int a, int b) {
return a + b;
}
تابع لامبدا
auto add = [](int a, int b) {
return a + b;
};
گام های عملی
- جای نیاز به تابع کوتاه را پیدا کن.
- پارامترها و capture مناسب را تعیین کن.
- لامبدا را بساز و همان جا اجرا کن.
نکته: برای مرور، صفحه توابع لامبدا را علامت گذاری کن. همچنین نگاهی به بازگشت/بازگشتی و بارگذاری هم نام بینداز.
جمع بندی سریع
- لامبدا یعنی تابع بی نام و سریع.
- capture با
[]مقدار یا ارجاع می گیرد. - کار کوتاه؟ لامبدا انتخاب خوب است.
- کار تکراری؟ تابع عادی بهتر است.