توابع در لوا
تعریف و فراخوانی توابع، پارامتر، مقدار برگشتی و 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
این مبحث بخشی از دوره آموزش کامل لوا است.