تركيب الدوال
سَلْسِل التحويلات
تركيب الدوال درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
ما هي عملية التركيب؟
تجمع عملية تركيب الدوال دالتين في دالة واحدة. تمرر الدالة المركبة مدخلها عبر الدالة الأولى، ثم تمرر النتيجة إلى الدالة الثانية.
يُكتب ذلك في الرياضيات على الصورة f(g(x)). ويتيح التركيب بناء تحويلات كبيرة من دوال صغيرة ومركزة.
تركيب دالتين
تستقبل الدالة المساعدة compose دالتين وتُعيد دالة جديدة. وعند استدعائها، تُشغّل g أولًا، ثم تمرر النتيجة إلى f.
الترتيب مهم: تُشغّل الدالة الداخلية أولًا، ثم تعمل الدالة الخارجية على ناتجها.
local function compose(f, g)
return function(x)
return f(g(x))
end
end
local function inc(n) return n + 1 end
local function dbl(n) return n * 2 end
local incThenDouble = compose(dbl, inc)
print(incThenDouble(3))الترتيب مهم
يؤدي تبديل المعاملات إلى تغيير النتيجة. يعني compose(f, g) تطبيق g أولًا، ثم f.
يوضح المثال أدناه أن المضاعفة ثم الزيادة يعطيان إجابة مختلفة عن الزيادة ثم المضاعفة.
local function compose(f, g) return function(x) return f(g(x)) end end
local function inc(n) return n + 1 end
local function dbl(n) return n * 2 end
print(compose(dbl, inc)(3))
print(compose(inc, dbl)(3))تركيب دوال السلاسل النصية
يعمل التركيب مع أي دوال أحادية المعامل، بما في ذلك تحويلات السلاسل النصية. ويمكنكم ربط عمليات إزالة المسافات أو تغيير حالة الأحرف أو عكس السلسلة في خطوة واحدة قابلة لإعادة الاستخدام.
هنا تُنفَّذ عملية العكس أولًا، ثم تحويل الأحرف إلى أحرف كبيرة، فتنتج سلسلة معكوسة بأحرف كبيرة.
local function compose(f, g) return function(x) return f(g(x)) end end
local shout = compose(string.upper, string.reverse)
print(shout("lua"))تركيب عدة دوال
لربط أكثر من دالتين، اكتبوا دالة composeAll تقبل عددًا متغيرًا من الدوال. فهي تطبق الدوال من اليمين إلى اليسار، كما في الاستدعاءات المتداخلة.
تمر الحلقة على قائمة الدوال من الخلف، وتمرر القيمة بالتتابع عبر كل دالة.
local function composeAll(...)
local fns = {...}
return function(x)
for i = #fns, 1, -1 do
x = fns[i](x)
end
return x
end
end
local f = composeAll(function(n) return n + 1 end,
function(n) return n * 2 end,
function(n) return n - 3 end)
print(f(10))من اليمين إلى اليسار
في composeAll(a, b, c) تُشغّل الدالة الموجودة في أقصى اليمين c أولًا، ثم b، ثم a. وهذا يطابق الصيغة المتداخلة a(b(c(x))).
قد يكون من الصعب قراءة هذا الترتيب، ولذلك يفضّل بعض الأشخاص استخدام أنبوب من اليسار إلى اليمين بدلًا منه.
أنبوب من اليسار إلى اليمين
يعكس pipe ترتيب القراءة: تُشغّل الدوال من اليسار إلى اليمين، وفق الترتيب المكتوب. ويرى كثيرون أن هذا أسهل في المتابعة عند إنشاء سلاسل معالجة البيانات.
تمر الحلقة إلى الأمام، وتطبق كل دالة على القيمة الحالية.
local function pipe(...)
local fns = {...}
return function(x)
for i = 1, #fns do
x = fns[i](x)
end
return x
end
end
local process = pipe(function(n) return n + 1 end,
function(n) return n * 2 end)
print(process(5))الأنبوب من أجل الوضوح
مع pipe، تُقرأ الخطوات من الأعلى إلى الأسفل وفق ترتيب التنفيذ. وهذا يجعل التحويلات متعددة المراحل موضحةً لذاتها.
هنا تُزال بادئة من سلسلة نصية، ثم تُحوَّل إلى أحرف صغيرة، ثم تُعكس، مع عرض كل خطوة بالترتيب الذي تُنفَّذ به.
local function pipe(...) local fns={...} return function(x) for i=1,#fns do x=fns[i](x) end return x end end
local transform = pipe(string.lower, string.reverse,
function(s) return "[" .. s .. "]" end)
print(transform("LUA"))التركيب مع الإغلاقات
يمكنكم تركيب الدوال المنشأة باستخدام التطبيق الجزئي أو الإغلاقات. أنشئوا دوال صغيرة متخصصة، ثم اجمعوها معًا.
يحافظ ذلك على قابلية اختبار كل جزء، بينما يعبّر التركيب عن التدفق العام.
local function pipe(...) local fns={...} return function(x) for i=1,#fns do x=fns[i](x) end return x end end
local function adder(n) return function(x) return x + n end end
local function muller(n) return function(x) return x * n end end
local calc = pipe(adder(3), muller(10))
print(calc(2))التركيب وسلاسل المعالجة
التركيب هو الرابط الذي يقف وراء سلاسل معالجة البيانات. بدلًا من تداخل الاستدعاءات بعمق، سمّوا دالة مركبة مرة واحدة وطبّقوها على مدخلات عديدة.
ويعمل ذلك بصورة ممتازة مع map: مرروا دالة مركبة لتحويل كل عنصر.
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function compose(f, g) return function(x) return f(g(x)) end end
local step = compose(function(n) return n + 1 end, function(n) return n * n end)
local r = map({1, 2, 3, 4}, step)
print(table.concat(r, ", "))حافظوا على صغر الدوال
يكافئ التركيب استخدام دوال صغيرة ذات غرض واحد. تنفذ كل دالة مهمة واحدة، ثم تجمعونها لتشكيل سلوك معقد من دون إعادة كتابة المنطق.
هذا هو جوهر التصميم الوظيفي: ابنوا مجموعة من الدوال الصغيرة جدًا، ثم ركّبوها للتعبير عن أفكار أكبر.
تحقق سريع
تتبّعوا الترتيب بعناية قبل الإجابة.
مراجعة
يجمع التركيب الدوال بحيث تنتقل مخرجات إحداها إلى الدالة التالية. يشغّل compose(f, g) الدالة g ثم f، من اليمين إلى اليسار، بينما يشغّل pipe الدوال من اليسار إلى اليمين لتسهيل القراءة.
باستخدام composeAll وpipe، يمكنكم ربط العديد من الدوال الصغيرة في سلاسل معالجة واضحة، وتزداد فائدتها خصوصًا عند دمجها مع map.
الأسئلة الشائعة
هل درس «تركيب الدوال» مجاني؟
نعم — نص درس «تركيب الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «تركيب الدوال»؟
سَلْسِل التحويلات تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تركيب الدوال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.