آرگومانهای متغیر (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("#", ...) - یکییکی بگیرید:
select(n, ...) - مستقیم به تابع دیگر بدهید:
otherFunc(...)
تابع 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
این مبحث بخشی از دوره آموزش کامل لوا است.