מטא־מתודות אריתמטיות חלק 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היכולת הזו להגדיר התנהגות מותאמת אישית של אופרטורים נקראת העמסת אופרטורים.
אתגר
קלכתבו פונקציה 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות4מבוא למטא־טבלאות
מהי מטא־טבלה?setmetatable ו־getmetatableמטא־מתודת __indexמטא־מתודת __newindexמטא־מתודת __tostringמטא־מתודות אריתמטיות חלק 1מטא־מתודות אריתמטיות חלק 2סיכום — טבלה לקריאה בלבד2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאיםתרגלו בעצמכם: קומפיילר Lua אונליין