توابع درجه‌بالا و 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تابع که متغیرهای اطرافش را به یاد دارد

این مبحث بخشی از دوره آموزش کامل لوا است.

ابزارهای مرتبط