تعريف الدوال واستدعاؤها
تعلّم صياغة تعريف الدوال، وقواعد استدعائها، والفرق بين الدوال المحلية والعالمية
تعريف الدوال واستدعاؤها درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
صيغة الدوال
تُعرَّف الدوال في Lua باستخدام الكلمة المفتاحية function. ويكون جسم الدالة كتلة تنتهي بـ end. ويمكن أن تكون الدوال عامة أو محلية. وتستدعي الدالة بإضافة أقواس تحتوي على الوسائط. وإذا حذفت الوسائط، فستتلقى المعلمات المفقودة القيمة nil.
function sayHello(name)
print("Hello, " .. (name or "World") .. "!")
end
sayHello("Lua") -- Hello, Lua!
sayHello() -- Hello, World!
local function add(a, b)
return a + b
end
print(add(3, 4)) -- 7القيم المُعادة
تعيد الدوال القيم باستخدام return. وبخلاف معظم اللغات، يمكن لدوال Lua إعادة عدة قيم. وإذا لم تُعد الدالة قيمة صراحةً، فإنها لا تعيد شيئًا (صفرًا من القيم). وتُهمَل القيم المُعادة الزائدة عندما لا يكون الاستدعاء هو التعبير الأخير في قائمة.
local function minMax(t)
local lo, hi = t[1], t[1]
for i = 2, #t do
if t[i] < lo then lo = t[i] end
if t[i] > hi then hi = t[i] end
end
return lo, hi
end
local lo, hi = minMax({5,2,8,1,9})
print(lo, hi) -- 1 9الدالة بوصفها قيمة
الدوال قيم من الدرجة الأولى في Lua. يمكنك تخزينها في المتغيرات، وتمريرها كوسائط إلى دوال أخرى، وإعادتها من الدوال. ويتيح ذلك استخدام الاستدعاءات الراجعة، والدوال من الرتبة العليا، وأنماط البرمجة الوظيفية.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end,
mul = function(a, b) return a * b end,
}
local function apply(op, a, b)
return op(a, b)
end
print(apply(ops.add, 10, 3)) -- 13
print(apply(ops.mul, 4, 5)) -- 20الدوال المحلية والعامة
استخدم local function للدوال المساعدة الخاصة بالوحدة. فالدوال العامة تلوّث مساحة الأسماء العامة ويمكن الوصول إليها من أي مكان، مما قد يسبب تعارضات في الأسماء. وفي معظم الحالات، فضّل الدوال المحلية ولا تُظهر عبر جدول الوحدة إلا ما تحتاج إليه.
-- Bad: pollutes global namespace
function helper() end
-- Good: module-local
local function helper()
return "I am local"
end
-- Module export pattern
local M = {}
function M.publicFunc()
return helper() -- can call local
end
return Mالدوال الأسلوبية بصيغة النقطتين
توفر Lua صيغة مختصرة نحويًا لتعريف الأساليب واستدعائها على الجداول. فـ obj:method(arg) مكافئة لـ obj.method(obj, arg). وتمرر صيغة النقطتين الجدول ضمنيًا بوصفه الوسيط الأول، الذي يُسمى اصطلاحيًا self.
local Dog = {}
Dog.__index = Dog
function Dog.new(name)
return setmetatable({name=name}, Dog)
end
function Dog:speak()
print(self.name .. " says: Woof!")
end
local d = Dog.new("Rex")
d:speak() -- Rex says: Woof!نمط المعلمات الاختيارية
لا تحتوي Lua على معلمات اختيارية مضمّنة، لكن يمكنك محاكاتها باستخدام عمليات التحقق من nil. مرّر جدول خيارات واحدًا إلى الدوال التي تحتوي على معلمات اختيارية كثيرة؛ فهذا أوضح من قائمة وسائط طويلة.
local function createUser(name, opts)
opts = opts or {}
return {
name = name,
role = opts.role or "user",
active = opts.active ~= false,
score = opts.score or 0,
}
end
local u = createUser("Alice", {role="admin", score=100})
print(u.name, u.role, u.score)الاستدعاءات الذيلية
الاستدعاء الذّيلي هو استدعاء دالة يقع في الموضع الذّيلي، أي يكون آخر إجراء قبل الإعادة. تنفذ Lua تحسين الاستدعاء الذّيلي؛ فالاستدعاء الذّيلي السليم لا يستخدم مساحة إضافية في المكدس. ويتيح ذلك استخدام الاستدعاء الذاتي العميق دون فيضان المكدس عندما يكون الاستدعاء الذاتي في الموضع الذّيلي.
local function factorial(n, acc)
acc = acc or 1
if n <= 1 then return acc end
return factorial(n - 1, n * acc) -- tail call!
end
print(factorial(10)) -- 3628800
-- Can handle very large n without stack overflowالدوال المستدعاة فورًا
يمكنك تعريف دالة واستدعاؤها فورًا: (function() ... end)(). ويفيد ذلك في إنشاء نطاق محلي، أو تنفيذ شيفرة الإعداد مرة واحدة بالضبط، أو تجنب تلويث النطاق الخارجي بمتغيرات مؤقتة.
local result = (function()
local temp = 100
local adjusted = temp * 1.5
return math.floor(adjusted)
end)()
print(result) -- 150
-- temp and adjusted not visible hereتخزين الدوال في الجداول
يُعد تخزين الدوال في الجداول أسلوبًا شائعًا في تصميم وحدات Lua. ويعمل الجدول بوصفه مساحة أسماء. وتعرّف الدوال بإسنادها إلى حقول الجدول أو باستخدام صيغة النقطة أو النقطتين مع اسم الجدول.
local math2 = {}
function math2.clamp(val, lo, hi)
return math.max(lo, math.min(hi, val))
end
function math2.lerp(a, b, t)
return a + (b - a) * t
end
print(math2.clamp(150, 0, 100)) -- 100
print(math2.lerp(0, 10, 0.5)) -- 5.0الإغلاقات بوصفها استدعاءات راجعة
تقبل الدوال من الرتبة العليا استدعاءات راجعة. وفي Lua، الاستدعاءات الراجعة ليست سوى قيم دوال. وتفيد الإغلاقات خصوصًا بوصفها استدعاءات راجعة لأنها تلتقط سياق الاستدعاء دون الحاجة إلى تمرير وسائط إضافية عبر الدالة من الرتبة العليا.
local function forEach(t, fn)
for i, v in ipairs(t) do
fn(v, i)
end
end
local sum = 0
forEach({10, 20, 30}, function(v)
sum = sum + v
end)
print(sum) -- 60
forEach({"a","b","c"}, function(v, i)
print(i, v)
end)تحقق سريع
ما ناتج: local function f() return 1, 2, 3 end; local a, b = f()؟
مراجعة: الدوال
النقاط الأساسية:
- استخدم
local functionلتجنب تلويث النطاق العام - الدوال من الدرجة الأولى: يمكن تخزينها في المتغيرات والجداول وتمريرها كوسائط
- صيغة النقطتين تمرر
selfضمنيًا - حاكِ الوسائط الاختيارية باستخدام
opts or {} - تجنب الاستدعاءات الذيلية امتلاء المكدس عند التكرار العميق
- تنشئ الدوال المستدعاة فورًا نطاقات معزولة
الأسئلة الشائعة
هل درس «تعريف الدوال واستدعاؤها» مجاني؟
نعم — نص درس «تعريف الدوال واستدعاؤها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعريف الدوال واستدعاؤها»؟
تعلّم صياغة تعريف الدوال، وقواعد استدعائها، والفرق بين الدوال المحلية والعالمية تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تعريف الدوال واستدعاؤها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف الدوال واستدعاؤها
- القيم المرجعة المتعددة
- المعامل ... والمعاملات المتغيرة العدد
- الاستدعاء الذاتي في Lua