توابع درجهبالا و Closure در لوا
توابع بهعنوان مقدار، توابع بینام، closure و کاربردهای عملی
تابع درجهبالا چیست؟
تابع درجهبالا (Higher-Order Function) تابعی است که:
- تابع دیگری را بهعنوان آرگومان میگیرد، یا
- تابعی را بهعنوان نتیجه برمیگرداند
در لوا توابع «شهروند درجهیک» هستند — یعنی مثل عدد و رشته میتوان آنها را در متغیر گذاشت، به تابع داد و برگرداند!
توابع بهعنوان مقدار
local f = print -- تابع print را در متغیر بگذار
f("سلام!") -- مثل print کار میکند
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end,
}
print(ops.add(10, 5)) -- 15
print(ops.sub(10, 5)) -- 5
تابع بهعنوان آرگومان
-- تابعی که تابع دیگر را اجرا میکند
local function applyTwice(func, value)
return func(func(value))
end
local double = function(x) return x * 2 end
print(applyTwice(double, 5)) -- 20 (دو بار ضرب در ۲)
تابع بهعنوان نتیجه
-- سازنده تابع ضرب
local function makeMultiplier(n)
return function(x)
return x * n
end
end
local double = makeMultiplier(2)
local triple = makeMultiplier(3)
print(double(10)) -- 20
print(triple(10)) -- 30
Closure — بستار
Closure تابعی است که متغیرهای محیط تعریفش را «به یاد میسپارد»:
local function makeCounter()
local count = 0 -- این متغیر در closure زنده میماند!
return function()
count = count + 1
return count
end
end
local counter = makeCounter()
print(counter()) -- 1
print(counter()) -- 2
print(counter()) -- 3
-- هر counter مستقل است!
local counter2 = makeCounter()
print(counter2()) -- 1
Closure یکی از قدرتمندترین ابزارهای لواست — برای شمارندهها، ذخیره وضعیت و ماژولسازی استفاده میشود.
مثال عملی: فیلتر و نگاشت
-- پیادهسازی map و filter با توابع درجهبالا
local function map(arr, func)
local result = {}
for i, v in ipairs(arr) do
result[i] = func(v)
end
return result
end
local function filter(arr, func)
local result = {}
for _, v in ipairs(arr) do
if func(v) then
table.insert(result, v)
end
end
return result
end
local numbers = {1, 2, 3, 4, 5, 6}
local doubled = map(numbers, function(n) return n * 2 end)
print("دوبرابر:", table.concat(doubled, ", "))
local evens = filter(numbers, function(n) return n % 2 == 0 end)
print("زوجها:", table.concat(evens, ", "))
مرتبسازی با تابع مقایسه
local people = {
{name = "علی", age = 30},
{name = "مریم", age = 25},
{name = "رضا", age = 35},
}
-- مرتبسازی بر اساس سن
table.sort(people, function(a, b)
return a.age < b.age
end)
for _, p in ipairs(people) do
print(p.name, p.age)
end
خلاصه
| مفهوم | یعنی |
|---|---|
| تابع بینام | تابع بدون نام: function(x) return x end |
| تابع درجهبالا | تابع که تابع میگیرد یا برمیگرداند |
| Closure | تابع که متغیرهای اطرافش را به یاد دارد |
این مبحث بخشی از دوره آموزش کامل لوا است.