map وfilter وreduce
أنشئ مساعدات عالية الرتبة
map وfilter وreduce درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
الثلاثة الأساسية
تُعد map وfilter وreduce الأدوات الأساسية لمعالجة القوائم بأسلوب وظيفي. تأخذ كل واحدة منها قائمة ودالة، وتعيد نتيجة من دون أن تكتبوا الحلقة يدويًا.
لا تأتي هذه الأدوات مضمّنة في Lua، لكن من السهل كتابة كل منها، كما أنها توضّح طريقة عمل الدوال عالية الرتبة.
Map: تحويل كل عنصر
تطبّق map دالة على كل عنصر، وتجمع النتائج في قائمة جديدة. وتبقى القائمة الأصلية دون تغيير.
تحدد الدالة التي تمرّرونها عملية التحويل، لذا تتولى map نفسها عمليات المضاعفة أو التربيع أو أي تغيير يُطبّق على كل عنصر.
local function map(t, f)
local out = {}
for i, v in ipairs(t) do
out[i] = f(v)
end
return out
end
local r = map({1, 2, 3}, function(x) return x * x end)
print(table.concat(r, ", "))يحافظ map على الطول
تعيد map دائمًا قائمة تحتوي على العدد نفسه من العناصر الموجودة في المدخل. ويتحوّل كل عنصر إلى عنصر ناتج واحد بالضبط.
إذا كنتم بحاجة إلى حذف عناصر، فهذه مهمة filter وليست map.
local function map(t, f)
local out = {}
for i, v in ipairs(t) do out[i] = f(v) end
return out
end
local names = {"ada", "lin", "sam"}
local caps = map(names, string.upper)
print(table.concat(caps, " "))
print(#caps)Filter: الاحتفاظ ببعض العناصر
تحتفظ filter بالعناصر التي تُرجع الدالة الشرطية لها القيمة true فقط. والدالة الشرطية هي دالة تُرجع قيمة منطقية.
تكون النتيجة قائمة جديدة قد تكون أقصر من القائمة الأصلية، لكنها لا تكون أطول منها أبدًا.
local function filter(t, pred)
local out = {}
for _, v in ipairs(t) do
if pred(v) then out[#out + 1] = v end
end
return out
end
local evens = filter({1,2,3,4,5,6}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", "))يحافظ filter على الترتيب
تسير filter على القائمة بالترتيب، وتضيف كل عنصر يتم الاحتفاظ به، لذلك تبقى العناصر الناجية في تسلسلها الأصلي.
يضمن استخدام #out + 1 كفهرس أن تكون النتيجة مصفوفة متسلسلة بلا فجوات، وهو ما تتعامل معه Lua كتسلسل صحيح.
local function filter(t, pred)
local out = {}
for _, v in ipairs(t) do
if pred(v) then out[#out + 1] = v end
end
return out
end
local long = filter({"hi", "hello", "yo", "howdy"},
function(s) return #s > 2 end)
print(table.concat(long, ", "))Reduce: الدمج في قيمة واحدة
تعمل reduce، التي تُسمّى أيضًا fold، على اختزال قائمة إلى قيمة واحدة. وهي تحتفظ بمُراكم وتدمجه مع كل عنصر باستخدام دالتكم.
تحددون قيمة ابتدائية ودالة دمج، ثم تمرّر reduce المراكم عبر كل عنصر.
local function reduce(t, f, acc)
for _, v in ipairs(t) do
acc = f(acc, v)
end
return acc
end
local sum = reduce({1,2,3,4}, function(a, x) return a + x end, 0)
print(sum)يتمتع reduce بالمرونة
بتغيير دالة الدمج والقيمة الابتدائية، يمكن لـ reduce حساب المجموع أو حاصل الضرب أو القيمة العظمى، أو بناء سلسلة نصية.
يبدأ المراكم هنا بالقيمة 1 ويجري ضربه، مما ينتج حاصل ضرب على نمط المضروب.
local function reduce(t, f, acc)
for _, v in ipairs(t) do acc = f(acc, v) end
return acc
end
local product = reduce({1,2,3,4,5}, function(a, x) return a * x end, 1)
print(product)استخدام reduce لإيجاد القيمة العظمى
لا تقتصر reduce على العمليات الحسابية. إذ يمكن لدالة الدمج مقارنة القيم والاحتفاظ بالقيمة الأكبر في كل خطوة.
يسمح بدء المراكم بالعنصر الأول، أو بعدد صغير جدًا، لـ reduce بالعثور على القيمة العظمى بطريقة واضحة.
local function reduce(t, f, acc)
for _, v in ipairs(t) do acc = f(acc, v) end
return acc
end
local max = reduce({3, 8, 2, 11, 6},
function(a, x) if x > a then return x else return a end end, -math.huge)
print(max)ربطها معًا
تظهر القوة الحقيقية عند ربط الأدوات الثلاث معًا. تعمل filter على تضييق البيانات، ثم تحولها map، وتلخصها reduce.
تمثل كل مرحلة خطوة صغيرة واضحة، وتستبدل المراحل مجتمعةً حلقة يدوية متشابكة.
local function filter(t, p) local o={} for _,v in ipairs(t) do if p(v) then o[#o+1]=v end end return o end
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function reduce(t, f, a) for _,v in ipairs(t) do a=f(a,v) end return a end
local nums = {1,2,3,4,5,6}
local r = reduce(map(filter(nums, function(x) return x%2==0 end),
function(x) return x*x end), function(a,x) return a+x end, 0)
print(r)تبقى القوائم الأصلية سليمة
تنشئ map وfilter جداول جديدة دائمًا ولا تعدّلان المدخل. وهذا يجعل مسارات المعالجة متوقعة، إذ تظل البيانات السابقة متاحة بعد كل مرحلة.
كما تترك reduce القائمة دون تغيير، وتُرجع النتيجة المدمجة فقط.
عام لأي قائمة
بما أن الدالة معامل، تعمل هذه الأدوات مع أي بيانات. فـ map نفسها تحول السلاسل النصية إلى أحرف كبيرة، أو تغيّر مقاييس الأسعار، أو تنسّق السجلات.
إن كتابة الحلقة مرة واحدة وتمرير دوال مختلفة هو بالضبط سبب فائدة الدوال من الدرجة الأولى.
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local prices = {10, 20, 30}
local withTax = map(prices, function(p) return p * 1.18 end)
print(table.concat(withTax, ", "))اختبار سريع
فكّروا في كيفية تأثير هذه العمليات في طول القائمة.
مراجعة
تحوّل map كل عنصر وتحافظ على الطول، بينما تحتفظ filter بالعناصر التي تجتاز دالة شرطية، وتختزل reduce القائمة إلى قيمة واحدة باستخدام مُراكم.
يؤدي ربط filter وmap وreduce إلى إنشاء مسارات معالجة واضحة للبيانات من دون حلقات يدوية، مع بقاء الجداول الأصلية دون تغيير.
الأسئلة الشائعة
هل درس «map وfilter وreduce» مجاني؟
نعم — نص درس «map وfilter وreduce» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «map وfilter وreduce»؟
أنشئ مساعدات عالية الرتبة تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «map وfilter وreduce»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال بوصفها قيمًا
- map وfilter وreduce
- التطبيق الجزئي
- تركيب الدوال