עיצוב מחרוזות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 16 מתוך 70.
כשמדפיסים אובייקט ישירות, Lua מציגה משהו לא מועיל כמו table: 0x55a.... רק כתובת זיכרון. מתודת המטא __tostring מאפשרת לך להגדיר בדיוק איזו מחרוזת תייצג את האובייקט שלך כשהוא מודפס או מומר לטקסט.
בתבנית המחלקה, מוסיפים את __tostring כפונקציה בטבלת המחלקה. מכיוון שהמחלקה עצמה משמשת כמטא־טבלה עבור המופעים, Lua מוצאת את הפונקציה הזו ומשתמשת בה באופן אוטומטי:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endכעת, כשמדפיסים מופע של Player, Lua קוראת למתודה __tostring שלך באופן אוטומטי:
local hero = Player:new("Luna", 5)
print(hero) -- פלט: Player: Luna (רמה 5)שימו לב ש-__tostring משתמש בתחביר הנקודתיים ומקבל את self, וכך מאפשר לכם גישה לכל נתוני המופע. הפונקציה חייבת להחזיר מחרוזת. תוכלו לעצב אותה בכל דרך שמתאימה לאובייקט שלכם, ולשלב כל מאפיין לייצוג קריא.
אתגר
קלבואו נבנה מחלקת Book שיודעת להציג את עצמה! כשתדפיסו ספר ישירות, Lua תציג מחרוזת מעוצבת היטב במקום כתובת זיכרון מסתורית: והכול בזכות המטא־מתודה __tostring.
תארגנו את הקוד בשני קבצים:
Book.lua: הגדירו את המחלקהBookבאמצעות תבנית האב־טיפוס הסטנדרטית. כל ספר צריך לאחסןtitleו-author. כללו בנאי:new(title, author)וממשו את המטא־מתודה__tostring, כך שהדפסת ספר תציג את פרטיו בפורמט קריא.main.lua: טענו את מודול Book, צרו מופעים של ספרים והדפיסו אותם ישירות כדי לראות את עיצוב המחרוזת המותאם אישית בפעולה.
המתודה __tostring צריכה להחזיר מחרוזת בפורמט המדויק הזה:
"[title]" by [author]שימו לב שהכותרת תחומה במירכאות כפולות בתוך מחרוזת הפלט.
תקבלו ארבעה קלטים:
- כותרת הספר הראשון
- מחבר הספר הראשון
- כותרת הספר השני
- מחבר הספר השני
בקובץ הראשי, צרו שני ספרים באמצעות הקלטים שסופקו והדפיסו כל ספר ישירות (לא באמצעות קריאה למתודה, אלא פשוט print(book)). כל ספר צריך להופיע בשורה משלו.
לדוגמה, אם הקלטים הם The Hobbit, J.R.R. Tolkien, 1984 ו-George Orwell, הפלט צריך להיות:
"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwellזכרו ש-__tostring חייבת להחזיר מחרוזת, ומכיוון שטבלת המחלקה שלכם משמשת כמטא־טבלה של המופעים, Lua תמצא ותשתמש אוטומטית בפונקציית __tostring שלכם כשתדפיסו ספר.
נסו בעצמכם
-- טען את המודול Book באמצעות require
local Book = require('Book')
-- קרא את הקלטים
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: צור שני מופעים של ספר באמצעות Book:new()
-- TODO: הדפס כל ספר ישירות (פשוט השתמש ב־print(book))
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין