setmetatable ו־getmetatable
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 17 מתוך 54.
עכשיו, כשאתם מבינים מהן מטא־טבלאות מבחינה רעיונית, הגיע הזמן ללמוד איך לעבוד איתן בפועל. Lua מספקת שתי פונקציות חיוניות לשם כך: setmetatable() כדי לשייך מטא־טבלה לטבלה, ו־getmetatable() כדי לאחזר אותה.
כדי לצרף מטא-טבלה לטבלה, משתמשים ב־setmetatable(). הפונקציה הזו מקבלת שני ארגומנטים: הטבלה שרוצים לשנות (הטבלה הראשית) ומטא-הטבלה שרוצים לצרף אליה:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)בדוגמה הזו, myMetatable מחוברת כעת אל myTable. המטא-טבלה עצמה ריקה לעת עתה, אבל כך נוצר הקשר בין שתי הטבלאות. הפונקציה setmetatable() גם מחזירה את הטבלה הראשית, מה שמאפשר לשרשר את הפעולה אם צריך.
כדי לאחזר את טבלת המטא שמצורפת לטבלה, משתמשים ב-getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- פלט: trueהפונקציה הזאת מחזירה את טבלת המטא אם היא מחוברת, או nil אם אין למערך טבלת מטא. הדבר שימושי כשצריך לבדוק או לשנות את טבלת המטא של מערך לאחר שהוגדרה.
הבנת שתי הפונקציות האלה היא הבסיס לכל העבודה עם מטא־טבלאות ב-Lua. ברגע שתוכלו להצמיד מטא־טבלאות ולאחזר אותן, תהיו מוכנים להגדיר מטא־מתודות שמשנות את אופן ההתנהגות של הטבלאות שלכם.
אתגר
קלכתבו פונקציה attachMetatable שמקבלת את mainTable ואת metaTable ומחזירה true אם המטא-טבלה צורפה בהצלחה.
השתמשו ב־setmetatable() כדי לצרף את המטא-טבלה לטבלה הראשית, ואז ודאו שהצירוף הצליח באמצעות getmetatable().
לוגיקה:
- צרפו את
metaTableאלmainTableבאמצעותsetmetatable() - קבלו את המטא-טבלה שצורפה באמצעות
getmetatable() - השוו את המטא-טבלה שהתקבלה למטא-טבלה המקורית
metaTable - החזירו
trueאם הן תואמות, ו־falseאחרת
פרמטרים:
mainTable(table): הטבלה שאליה תצורף המטא-טבלהmetaTable(table): המטא-טבלה שיש לצרף
ערך מוחזר: true אם המטא-טבלה צורפה ואומתה בהצלחה, ו־false אחרת (בוליאני)
נסו בעצמכם
function attachMetatable(mainTable, metaTable)
-- כתבו כאן קוד
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות4מבוא למטא־טבלאות
מהי מטא־טבלה?setmetatable ו־getmetatableמטא־מתודת __indexמטא־מתודת __newindexמטא־מתודת __tostringמטא־מתודות אריתמטיות חלק 1מטא־מתודות אריתמטיות חלק 2סיכום — טבלה לקריאה בלבד2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאיםתרגלו בעצמכם: קומפיילר Lua אונליין