Menu
Coddy logo textTech

מטא־מתודות אריתמטיות חלק 1

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

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

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

מתודת המטא __add קובעת את התנהגות החיבור. כש-Lua נתקלת באופרטור + בין שני ערכים, ולפחות לאחד מהם יש מטא־טבלה עם __add, היא קוראת לפונקציה הזאת במקום להפיק שגיאה:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- פלט: 4  6

הפונקציה __add מקבלת שני ארגומנטים: האופרנד השמאלי והאופרנד הימני. בדוגמה הזאת, היא יוצרת טבלה חדשה עם ערכי x ו-y שהם סכום הערכים המתאימים משתי טבלאות הקלט.

באופן דומה, מתודת המטא __sub שולטת בחיסור באמצעות האופרטור -:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- פלט: 2  2

היכולת הזו להגדיר התנהגות מותאמת אישית של אופרטורים נקראת העמסת אופרטורים.

challenge icon

אתגר

קל

כתבו פונקציה addVectors שמקבלת את x1, את y1, את x2 ואת y2, ומחזירה את התוצאה של חיבור שני וקטורים.

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

לוגיקה:

  • צרו את טבלת הווקטור הראשונה עם המפתחות x = x1 ו-y = y1
  • צרו את טבלת הווקטור השנייה עם המפתחות x = x2 ו-y = y2
  • צרו מטא־טבלה עם __add שמקבלת שני וקטורים ומחזירה טבלה חדשה עם x = a.x + b.x ו-y = a.y + b.y
  • הוסיפו את המטא־טבלה לשתי טבלאות הווקטור באמצעות setmetatable()
  • חברו את שני הווקטורים באמצעות v1 + v2
  • החזירו את התוצאה כמחרוזת בפורמט "x y" (ערכי x ו-y מופרדים ברווח)

פרמטרים:

  • x1 (מספר): קואורדינטת ה-x של הווקטור הראשון
  • y1 (מספר): קואורדינטת ה-y של הווקטור הראשון
  • x2 (מספר): קואורדינטת ה-x של הווקטור השני
  • y2 (מספר): קואורדינטת ה-y של הווקטור השני

החזרה: סכום שני הווקטורים כמחרוזת בפורמט "x y" (מחרוזת)

נסו בעצמכם

function addVectors(x1, y1, x2, y2)
    -- כתבו כאן את הקוד
end
quiz iconבחנו את עצמכם

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

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

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