الدوال بوصفها قيمًا
خزّن الدوال ومرّرها
الدوال بوصفها قيمًا درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
الدوال من الدرجة الأولى
الدوال في Lua قيم من الدرجة الأولى. وهذا يعني أن الدالة مجرد بيانات: يمكنكم تخزينها في متغير، وتمريرها إلى دالة أخرى، وإرجاعها، والاحتفاظ بها داخل جدول.
تدعم هذه الفكرة وحدها جميع أساليب البرمجة الوظيفية. وعندما تتعاملون مع الدوال كما تتعاملون مع الأعداد أو السلاسل النصية، يمكنكم بناء أدوات مرنة قابلة لإعادة الاستخدام.
تخزين دالة في متغير
الاسم الذي تمنحونه لدالة هو في الحقيقة مجرد متغير يحتفظ بقيمة الدالة. ويمكنكم إسناد تلك القيمة إلى متغير آخر بحرية.
يشير الاسمان أدناه إلى الدالة الأساسية نفسها، لذا فإن استدعاء أيٍّ منهما يشغّل الشيفرة نفسها.
local function greet(name)
return "Hello, " .. name
end
local hi = greet
print(greet("Ada"))
print(hi("Lin"))الدوال المجهولة
لا تحتاجون إلى اسم لإنشاء دالة. تُكتب الدالة المجهولة باستخدام الصياغة function ... end وتُستخدم مباشرةً كقيمة.
إسناد إحداها إلى متغير محلي يعادل تعريف دالة عادية، لكن بصياغة مضمنة.
local square = function(x)
return x * x
end
print(square(5))
print(square(9))الدوال كوسائط
بما أن الدوال قيم، يمكنكم تمريرها إلى دوال أخرى. وتُسمّى الدالة التي تستقبل دالة أخرى دالةً عالية الرتبة.
لا تعرف apply هنا العمل الذي يجب تنفيذه حتى تمرّروا إليها دالة لتشغيلها.
local function apply(f, x)
return f(x)
end
local function double(n) return n * 2 end
print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))إرجاع دالة
يمكن للدالة أن تُرجع دالة أخرى. ويتيح لكم ذلك إنشاء دوال عند الطلب، مع ضبطها وفقًا للوسائط التي مرّرتموها.
تنشئ multiplier أدناه دالة جديدة تمامًا في كل مرة، وتتذكر العامل الذي مرّرتموه إليها.
local function multiplier(factor)
return function(x)
return x * factor
end
end
local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))تلتقط الإغلاقات المتغيرات
عندما تستخدم دالة مُرجعة متغيرًا محليًا من الدالة المحيطة بها، فإنها تلتقط ذلك المتغير. ويُسمّى اقتران الدالة بالمتغيرات التي التقطتها إغلاقًا.
يبقى factor الملتقط موجودًا طوال فترة وجود الإغلاق، حتى بعد انتهاء استدعاء الدالة الخارجية.
local function counter()
local n = 0
return function()
n = n + 1
return n
end
end
local next = counter()
print(next())
print(next())
print(next())الدوال داخل الجداول
يمكن للجداول الاحتفاظ بالدوال مثل أي قيمة أخرى. وهكذا تنشئ Lua الوحدات والكائنات: إذ يربط الجدول الأسماء بقيم الدوال.
يمكنكم البحث عن دالة باستخدام مفتاح واستدعاؤها، أو حتى التكرار على جدول من العمليات.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end
}
print(ops.add(2, 3))
print(ops["sub"](9, 4))جدول من الاستراتيجيات
يتيح تخزين الدوال في جدول اختيار السلوك أثناء التشغيل باستخدام مفتاح. ويستبدل ذلك سلاسل if-else الطويلة بعملية بحث واضحة.
يؤدي اختيار العملية حسب الاسم إلى إبقاء شيفرة الاستدعاء قصيرة، كما يسهل توسيعها بإضافة مفاتيح جديدة.
local dispatch = {
upper = string.upper,
lower = string.lower,
rev = string.reverse
}
local function run(name, s)
return dispatch[name](s)
end
print(run("upper", "lua"))
print(run("rev", "lua"))دوال Callback
الـ callback هي دالة تمرّرونها لكي تُستدعى لاحقًا. وتستخدم مكتبة Lua القياسية هذا النمط؛ فعلى سبيل المثال، تستقبل table.sort دالة للمقارنة.
تحدد دالة callback القاعدة، بينما تتولى المكتبة التكرار وإعادة الترتيب.
local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
return a > b
end)
print(table.concat(nums, ", "))للدوال هوية
كل قيمة دالة هي كائن مستقل. ولا تتساوى دالتان مكتوبتان بشكل منفصل أبدًا، حتى إن احتوتا على الشيفرة نفسها.
لكن الدالة الواحدة المخزنة في متغيرين تكون متساوية عند المقارنة، لأن الاسمين يشيران إلى القيمة نفسها.
local f = function() return 1 end
local g = function() return 1 end
local h = f
print(f == g)
print(f == h)لماذا يهم ذلك
يتيح لكم التعامل مع الدوال كقيم كتابة أدوات عامة مرة واحدة وتخصيصها باستخدام الدوال التي تمرّرونها. وتعتمد على ذلك عمليات map وfilter والتطبيق الجزئي والتركيب.
تبني بقية هذه الدورة أنماطًا عملية فوق الدوال من الدرجة الأولى والإغلاقات.
اختبار سريع
اختبروا فهمكم للدوال من الدرجة الأولى في Lua.
مراجعة
الدوال في Lua قيم من الدرجة الأولى: خزّنوها في المتغيرات والجداول، ومرّروها كوسائط، وأرجعوها من دوال أخرى.
يؤدي إرجاع دالة تلتقط متغيرات محلية من الدالة المحيطة إلى إنشاء إغلاق. وتشكل هذه الأفكار الأساس لكل نمط وظيفي قادم.
الأسئلة الشائعة
هل درس «الدوال بوصفها قيمًا» مجاني؟
نعم — نص درس «الدوال بوصفها قيمًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال بوصفها قيمًا
- map وfilter وreduce
- التطبيق الجزئي
- تركيب الدوال