Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

توقيعات الفهارس (Index Signatures)

جزء من قسم مقدمة إلى Luau في رحلة Lua على Coddy — الدرس 72 من 73.

لقد تعاملت مع أنواع المخططات (map types) مثل {[string]: number} سابقًا في فصل الجداول — وهي ما يُعرف بـ index signature: أي مفتاح من نوع string يرتبط بقيمة من نوع number. وتظهر أهميتها عندما تكون المفاتيح غير معروفة أثناء كتابة الكود: مثل العدادات، الإعدادات، التخزين المؤقت (caches)، النقاط — أو أي شيء يتم إنشاؤه أثناء التشغيل (runtime).

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- يُسمح بأي مفتاح سلسلة نصية
counts["sword"] = 1
counts["potion"] += 1  -- يتم التحقق من القيم كأرقام

هناك حقيقتان في وقت التشغيل (runtime) تهمانك عند العمل مع الـ maps. أولاً، قراءة مفتاح لم يتم تعيينه مطلقًا ترجع nil — ويتعامل نمط العد التقليدي مع ذلك باستخدام or، لتحويل القيمة المفقودة missing إلى 0:

counts[item] = (counts[item] or 0) + 1

ثانيًا، تقوم دالة pairs() بالتكرار على مفاتيح الـ map بـ ترتيب غير مضمون — فشغل نفس البرنامج مرتين قد يمر على المفاتيح بترتيب مختلف. عندما تريد أن تكون المخرجات قابلة للتوقع، اجمع المفاتيح في array، وقم بفرزها بـ table.sort، ثم كرر على الـ array المفرز بدلاً من ذلك:

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

التحدي

سهل

قم بعدد الغنائم (loot) باستخدام خريطة محددة النوع (typed map).

  • قم بتصريح type Counts = {[string]: number}.
  • اكتب countItems(items: {string}): Counts بحيث تبني خريطة Counts جديدة، وتحسب عدد مرات ظهور كل سلسلة نصية (استخدم النمط (counts[item] or 0) + 1).
  • أنشئ local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} وقم بعدّها.
  • اطبع سطرًا واحدًا بصيغة [name]: [count] لكل عنصر فريد، بـ ترتيب أبجدي: اجمع الـ keys، وقم بـ table.sort لها، ثم اطبعها.

الناتج المتوقع:

potion: 3
shield: 1
sword: 2

جرّب بنفسك

-- اكتب الكود هنا
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts باستخدام (counts[item] or 0) + 1
-- 3) عدّ مصفوفة الغنائم من المهمة
-- 4) اجمع المفاتيح، table.sort لها، اطبع أسطر `{name}: {count}`
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس مقدمة إلى Luau