מטא־מתודות אריתמטיות חלק 2
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 22 מתוך 54.
בהמשך לחיבור ולחיסור, אפשר גם להגדיר התנהגות של כפל וחילוק עבור הטבלאות שלך באמצעות המתודות __mul ו־__div. הן פועלות באותו אופן כמו __add ו־__sub, אך מגיבות לאופרטורים * ו־/.
מתודת המטא __mul שימושית במיוחד כשאתה רוצה להגדיל את הערכים בטבלה. לדוגמה, כפל וקטור במספר (שנקרא סקלר) אמור להכפיל כל רכיב:
local vector = {x = 3, y = 4}
local meta = {
__mul = function(a, b)
local scalar = type(a) == "number" and a or b
local vec = type(a) == "table" and a or b
return {x = vec.x * scalar, y = vec.y * scalar}
end
}
setmetatable(vector, meta)
local scaled = vector * 2
print(scaled.x, scaled.y) -- פלט: 6 8שימו לב כיצד הפונקציה בודקת איזה אופרנד הוא המספר ואיזה הוא הטבלה. כך גם vector * 2 וגם 2 * vector פועלים כראוי.
מתודת המטא __div פועלת באופן דומה לחלוקה:
local meta = {
__div = function(a, b)
return {x = a.x / b, y = a.y / b}
end
}
setmetatable(vector, meta)
local divided = vector / 2
print(divided.x, divided.y) -- פלט: 1.5 2מתודות המטא האלה משלימות את פעולות החשבון הבסיסיות עבור הטיפוסים המותאמים אישית שלך, ומעניקות לך שליטה מלאה על אופן הפעולה של אופרטורים מתמטיים עם הטבלאות שלך.
אתגר
קלכתבו פונקציה scaleVector שמקבלת את x, את y ואת scalar, ומחזירה את הווקטור המוכפל בסקלר כמחרוזת בפורמט מסוים.
צרו טבלת וקטור עם הקואורדינטות הנתונות, צרפו מטאטבלה עם מתודת המטא __mul כדי לאפשר כפל בסקלר, הכפילו את הווקטור בסקלר באמצעות האופרטור *, והחזירו את התוצאה.
לוגיקה:
- צרו טבלת וקטור עם המפתחות
xו-yשמוגדרים לקואורדינטות שסופקו - צרו מטאטבלה עם
__mulשמטפלת בכפל בין וקטור לסקלר - הפונקציה
__mulצריכה לבדוק איזה אופרנד הוא המספר ואיזה הוא הטבלה - החזירו טבלה חדשה עם
x = vec.x * scalarו-y = vec.y * scalar - צרפו את המטאטבלה לטבלת הווקטור באמצעות
setmetatable() - הכפילו את הווקטור בסקלר באמצעות
vector * scalar - החזירו את התוצאה כמחרוזת בפורמט
"x y"(ערכי x ו-y מופרדים ברווח)
פרמטרים:
x(number): קואורדינטת ה-x של הווקטורy(number): קואורדינטת ה-y של הווקטורscalar(number): ערך הסקלר שבו יש להכפיל את הווקטור
ערך מוחזר: הווקטור המוכפל בסקלר כמחרוזת בפורמט "x y" (מחרוזת)
נסו בעצמכם
function scaleVector(x, y, scalar)
-- כתבו כאן קוד
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות4מבוא למטא־טבלאות
מהי מטא־טבלה?setmetatable ו־getmetatableמטא־מתודת __indexמטא־מתודת __newindexמטא־מתודת __tostringמטא־מתודות אריתמטיות חלק 1מטא־מתודות אריתמטיות חלק 2סיכום — טבלה לקריאה בלבד2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאיםתרגלו בעצמכם: קומפיילר Lua אונליין