توابع در لوا

تعریف و فراخوانی توابع، پارامتر، مقدار برگشتی و return چندگانه

تابع چیست؟

تابع (Function) بلوکی از کد است که یک‌بار تعریف می‌شود و بارها فراخوانی می‌شود. توابع کد را قابل استفاده مجدد و خوانا می‌کنند.

تعریف تابع

-- تعریف تابع
local function greet()
  print("سلام!")
end

-- فراخوانی
greet()
greet()   -- هر چند بار که بخواهید

پارامتر و آرگومان

local function greet(name)     -- name پارامتر است
  print("سلام " .. name .. "!")
end

greet("علی")      -- "علی" آرگومان است
greet("مریم")

مقدار برگشتی (return)

local function add(a, b)
  return a + b
end

local result = add(5, 3)
print(result)   -- 8

return چندگانه — ویژگی خاص لوا!

لوا می‌تواند چند مقدار هم‌زمان برگرداند:

local function minMax(numbers)
  local min, max = numbers[1], numbers[1]
  for _, n in ipairs(numbers) do
    if n < min then min = n end
    if n > max then max = n end
  end
  return min, max   -- دو مقدار!
end

local smallest, largest = minMax({5, 2, 9, 1, 7})
print("کوچک‌ترین:", smallest)   -- 1
print("بزرگ‌ترین:", largest)    -- 9

مقدار پیش‌فرض پارامتر

لوا مقدار پیش‌فرض ندارد، اما با الگوی or می‌توان ساخت:

local function greet(name, greeting)
  name = name or "مهمان"
  greeting = greeting or "سلام"
  return greeting .. " " .. name .. "!"
end

print(greet())                    -- سلام مهمان!
print(greet("علی"))               -- سلام علی!
print(greet("علی", "درود"))       -- درود علی!

آرگومان‌های اضافی و کم

لوا سخت‌گیر نیست — آرگومان کم بدهید nil می‌شود، اضافی بدهید نادیده گرفته می‌شود:

local function test(a, b, c)
  print(a, b, c)
end

test(1)           -- 1  nil  nil
test(1, 2)        -- 1  2  nil
test(1, 2, 3, 4)  -- 1  2  3 (۴ نادیده گرفته شد)

توابع محلی در برابر سراسری

-- تابع محلی (پیشنهادی!)
local function helper()
  return "کمک"
end

-- تابع سراسری (از این پرهیز کنید)
function globalHelper()
  return "سراسری"
end
همیشه local function استفاده کنید. فقط وقتی تابع باید سراسری باشد (مثلاً برای require شدن) از function خالی استفاده کنید.

توابع بی‌نام (Anonymous)

local double = function(x)
  return x * 2
end

print(double(5))   -- 10

توابع داخل جدول

local math2 = {
  square = function(x) return x * x end,
  cube = function(x) return x * x * x end,
}

print(math2.square(4))   -- 16
print(math2.cube(3))     -- 27

-- روش دوم تعریف (شکلی تمیزتر)
function math2.root(x) return math.sqrt(x) end
print(math2.root(16))    -- 4

return باید آخر بلوک باشد

local function check(x)
  if x > 0 then
    return "مثبت"
  end
  return "غیر مثبت"
  -- هیچ کدی بعد از return نمی‌آید
end

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

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