0Pricing
Lua Academy · درس

التكرار عبر الجداول باستخدام pairs وipairs

اجتز الجداول بأمان باستخدام pairs() وipairs()

التكرار عبر الجداول باستخدام pairs وipairs درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ipairs: التكرار المرتب على المصفوفات

تكرّر ipairs(t) على التسلسل الصحيح الذي يبدأ عند الفهرس 1، وتُرجع أزواج (index, value). وتتوقف عند أول قيمة nil. وهذا هو الخيار الآمن والمتوقع للجداول الشبيهة بالمصفوفات عندما يكون الترتيب مهمًا.

local fruits = {"apple","banana","cherry"}

for i, fruit in ipairs(fruits) do
  print(i, fruit)
end
-- 1  apple
-- 2  banana
-- 3  cherry

pairs: جميع المفاتيح

تكرّر pairs(t) على كل زوج مفتاح-قيمة غير nil في الجدول، بترتيب غير محدد. وتستخدم الدالة next() داخليًا. استخدموا pairs للقواميس، أو الجداول المختلطة، أو عندما تحتاجون إلى زيارة جميع المفاتيح بغض النظر عن نوعها.

local info = {name="Lua", version=5.4, embedded=true}

for k, v in pairs(info) do
  print(k, v)
end
-- name  Lua
-- version  5.4
-- embedded  true  (order may vary)

الاختيار بين pairs و ipairs

استخدموا ipairs للمصفوفات المتسلسلة (ترتيب مضمون، وتتوقف عند nil). واستخدموا pairs للقواميس، أو الجداول المختلطة، أو عندما تحتاجون إلى جميع المفاتيح. يعمل استخدام pairs على مصفوفة، لكنه لا يضمن أي ترتيب. أما استخدام ipairs على قاموس فيتجاهل المفاتيح غير الصحيحة.

local mixed = {10, 20, label="hello", 30}

-- ipairs: only sees 10, 20, 30 in order
for i, v in ipairs(mixed) do
  io.write(v .. " ")
end
print()  -- 10 20 30

-- pairs: sees everything
for k, v in pairs(mixed) do
  print(k, v)
end

عدّ العناصر

في التسلسلات، تعطي #t العدد. أما في القواميس، فلا يمكن الاعتماد على #t؛ لذا كرّروا باستخدام pairs وعدّوا العناصر يدويًا. وهذا تمييز مهم يمنع الأخطاء عند التعامل مع الجداول المختلطة أو ذات المفاتيح النصية.

local arr = {10, 20, 30}
print("#arr:", #arr)        -- 3 (reliable)

local dict = {a=1, b=2, c=3}
print("#dict:", #dict)      -- 0 (unreliable for dicts!)

local count = 0
for _ in pairs(dict) do count = count + 1 end
print("count:", count)       -- 3

تعديل القيم أثناء التكرار

يمكنكم بأمان تحديث قيمة مفتاح موجود أثناء التكرار باستخدام pairs. لكن إضافة المفاتيح أو إزالتها أثناء التكرار سلوك غير معرّف. اجمعوا التغييرات وطبّقوها بعد انتهاء الحلقة.

local prices = {apple=1.0, banana=0.5, cherry=2.0}

-- Safe: update existing values
for k, v in pairs(prices) do
  prices[k] = v * 1.1  -- 10% markup
end

for k, v in pairs(prices) do
  print(k, string.format("%.2f", v))
end

جمع المفاتيح

من العمليات الشائعة جمع جميع المفاتيح في مصفوفة مرتبة للحصول على مخرجات حتمية. كرّروا باستخدام pairs لجمع المفاتيح، ثم استخدموا table.sort لترتيبها.

local config = {host="localhost", port=8080, debug=true}
local keys = {}

for k in pairs(config) do
  keys[#keys+1] = k
end
table.sort(keys)

for _, k in ipairs(keys) do
  print(k, "=", config[k])
end
-- debug = true
-- host = localhost
-- port = 8080

التكرار على الجداول المتداخلة

بالنسبة إلى الجداول المتداخلة (جدول من الجداول)، اجمعوا بين حلقتين: تكرّر الحلقة الخارجية على المستوى الأعلى، بينما تكرّر الحلقة الداخلية على كل جدول متداخل. ويتعامل هذا النمط مع أي عمق باستخدام الاستدعاء递归ي للتداخلات غير المحدودة فعليًا.

local matrix = {
  {1,2,3},
  {4,5,6},
  {7,8,9},
}

for i, row in ipairs(matrix) do
  for j, val in ipairs(row) do
    io.write(string.format("%3d", val))
  end
  print()
end

التصفية باستخدام ipairs

أنشئوا قائمة مفلترة بالتكرار باستخدام ipairs وإضافة العناصر التي تحقق شرطًا معينًا. وتكون النتيجة مصفوفة جديدة تحتوي على العناصر المطابقة فقط.

local function filter(t, pred)
  local result = {}
  for _, v in ipairs(t) do
    if pred(v) then result[#result+1] = v end
  end
  return result
end

local nums = {1,2,3,4,5,6,7,8,9,10}
local evens = filter(nums, function(n) return n % 2 == 0 end)
print(table.concat(evens, " "))  -- 2 4 6 8 10

التحويل باستخدام ipairs

طبّقوا تحويلًا على كل عنصر: كرّروا وابنوا مصفوفة جديدة بالقيم المحوَّلة. وهذا هو المقابل في Lua للدالة map() في اللغات الوظيفية.

local function map(t, fn)
  local result = {}
  for i, v in ipairs(t) do
    result[i] = fn(v)
  end
  return result
end

local nums = {1, 2, 3, 4, 5}
local doubled = map(nums, function(n) return n * 2 end)
print(table.concat(doubled, " "))  -- 2 4 6 8 10

local words = {"hello","world"}
local upper = map(words, string.upper)
print(table.concat(upper, " "))    -- HELLO WORLD

pairs مع المكررات المخصصة

يمكنكم جعل كائن مخصص قابلًا للتكرار بإرجاع مكرّر وحالة من دالة. ويشبه هذا النمط طريقة عمل pairs داخليًا: إذ تُرجع next, t, nil. وبالمثل، يُرجع مصنع المكرّر لديكم دالةً مع حالة اختيارية.

local function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end

for v in values({"x","y","z"}) do
  print(v)
end
-- x
-- y
-- z

تحقق سريع

أي العبارات التالية صحيحة عن pairs() مقارنةً بـ ipairs()؟

مراجعة: pairs و ipairs

الملخص:

  • ipairs: مرتبة، بمفاتيح صحيحة تبدأ من 1، وتتوقف عند nil
  • pairs: جميع المفاتيح، بأي ترتيب، ولا تتوقف مبكرًا
  • استخدموا pairs للقواميس، وipairs للمصفوفات
  • لا تضيفوا المفاتيح أو تزيلوها أثناء التكرار باستخدام pairs؛ أما تحديث القيم الموجودة فهو آمن
  • اجمعوا المفاتيح ورتّبوها للحصول على مخرجات حتمية

الأسئلة الشائعة

هل درس «التكرار عبر الجداول باستخدام pairs وipairs» مجاني؟

نعم — نص درس «التكرار عبر الجداول باستخدام pairs وipairs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «التكرار عبر الجداول باستخدام pairs وipairs»؟

اجتز الجداول بأمان باستخدام pairs() وipairs() تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التكرار عبر الجداول باستخدام pairs وipairs»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الجداول بوصفها مصفوفات
  2. الجداول بوصفها قواميس
  3. التكرار عبر الجداول باستخدام pairs وipairs
  4. الجداول المتداخلة والبيانات المهيكلة
← العودة إلى Lua Academy