Menu
Coddy logo textTech

מטא־מתודת __index

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 18 מתוך 54.

עכשיו, כשאתה יודע איך להצמיד מטא־טבלאות לטבלאות, הגיע הזמן ללמוד על המטא־מתודה החשובה ביותר: __index. המטא־מתודה הזאת קובעת מה קורה כשמנסים לגשת למפתח שאינו קיים בטבלה.

בדרך כלל, כשמחפשים בטבלה מפתח שאינו נמצא בה, Lua מחזירה nil. אבל כשל־טבלה יש מטא־טבלה עם שדה __index, Lua תבדוק את השדה הזה במקום זאת. אם __index מצביע על טבלה אחרת, Lua תחפש שם את המפתח:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- פלט: Alice
print(player.health)  -- פלט: 100

בדוגמה הזו, ל־player יש רק מפתח name. כשניגשים אל player.health, Lua לא מוצאת אותו בתוך player, ולכן בודקת את השדה __index של טבלת המטא. מכיוון ש־__index מצביע על הטבלה defaults, Lua מחפשת שם ומוצאת health = 100.

כך נוצר מנגנון חלופי שבו טבלה אחת יכולה לספק ערכי ברירת מחדל לטבלה אחרת. הטבלה המקורית שומרת על הערכים שלה, אבל כל מפתח חסר מחופש באופן אוטומטי בטבלת ברירת המחדל.

challenge icon

אתגר

קל

כתוב פונקציה createCharacterWithDefaults שמקבלת את name ואת level ומחזירה טבלת דמות עם ערכי ברירת מחדל לנתונים.

צור טבלת דמות עם השם והרמה שסופקו. השתמש במטא-טבלה עם __index כדי לספק ערכי ברירת מחדל לכל נתון חסר (health, mana, strength).

לוגיקה:

  • צור טבלת ברירות מחדל עם המפתחות: health = 100, mana = 50, strength = 10
  • צור טבלת דמות עם המפתחות: name (השם שסופק) ו-level (הרמה שסופקה)
  • צור מטא-טבלה שבה __index מצביע לטבלת ברירות המחדל
  • צרף את המטא-טבלה לטבלת הדמות באמצעות setmetatable()
  • החזר את טבלת הדמות

פרמטרים:

  • name (מחרוזת): שם הדמות
  • level (מספר): רמת הדמות

ערך מוחזר: טבלת דמות עם שם, רמה ונתוני ברירת מחדל הנגישים דרך המטא-טבלה (טבלה)

נסו בעצמכם

function createCharacterWithDefaults(name, level)
    -- כתבו כאן את הקוד
end
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Lua אונליין