آرگومان‌های متغیر (Varargs) در لوا

آرگومان‌های نامحدود با ...، توابع select و table.pack/unpack

آرگومان‌های متغیر چیست؟

گاهی نمی‌دانیم تابع ما چند آرگومان می‌گیرد — مثل print که هر تعداد آرگومان قبول می‌کند! در لوا با ... (سه نقطه) این کار ممکن است:

local function sum(...)
  local total = 0
  for _, n in ipairs({...}) do
    total = total + n
  end
  return total
end

print(sum(1, 2, 3))         -- 6
print(sum(1, 2, 3, 4, 5))   -- 15
print(sum())                -- 0

... چیست؟

... نماینده همه آرگومان‌های اضافی است. می‌توانید آن‌ها را:

تابع select

local function info(...)
  local count = select("#", ...)   -- تعداد آرگومان‌ها
  print("تعداد:", count)

  -- آرگومان n به بعد
  local second = select(2, ...)
  print("دومی:", second)
end

info("الف", "ب", "ج", "د")

ترکیب پارامتر معمولی و varargs

local function greet(greeting, ...)
  -- greeting اولین آرگومان است
  local result = greeting

  -- بقیه آرگومان‌ها
  for _, name in ipairs({...}) do
    result = result .. " " .. name
  end

  return result .. "!"
end

print(greet("سلام", "علی", "مریم", "رضا"))
-- سلام علی مریم رضا!

انتقال varargs به تابع دیگر

local function log(prefix, ...)
  print("[" .. prefix .. "]", ...)
end

local function debugLog(...)
  log("DEBUG", ...)   -- همه آرگومان‌ها منتقل می‌شوند
end

debugLog("مقدار x:", 42, "و y:", 3.14)

table.unpack — پخش جدول به آرگومان‌ها

local args = {10, 3}

print(math.max(table.unpack(args)))   -- مثل math.max(10, 3)

local function diff(a, b)
  return a - b
end

print(diff(table.unpack(args)))   -- 7
در لوا 5.1 این تابع unpack نام داشت؛ از 5.2 به table.unpack منتقل شد.

مثال عملی: تابع max دلخواه

local function myMax(...)
  local args = {...}
  if #args == 0 then return nil end

  local max = args[1]
  for i = 2, #args do
    if args[i] > max then
      max = args[i]
    end
  end
  return max
end

print(myMax(3, 7, 1, 9, 4))   -- 9
print(myMax(42))              -- 42

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

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