שרשור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 28 מתוך 70.
האופרטור .. ב-Lua מחבר מחרוזות, אבל מה אם רוצים לשלב אובייקט עם מחרוזת? מטא-מתודה __concat מאפשרת להגדיר בדיוק איך זה אמור לעבוד.
כאשר Lua נתקלת ב־a .. b ולאחד האופרנדים יש מתודת מטא __concat, היא קוראת לפונקציה הזאת עם שני הערכים. זה שימושי כשאתה רוצה שאובייקטים ישתלבו באופן טבעי בביטויי מחרוזת.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endשימו לב שהפונקציה בודקת איזה אופרנד הוא המחרוזת. מכיוון שאפשר להשתמש ב־.. כך: "Hello " .. obj או obj .. "!", המתודה המטא־תכנותית שלכם צריכה לטפל בשני המקרים.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- פלט: Dr. Ada Lovelace
print(person .. " PhD") -- פלט: Ada Lovelace PhDכמו מטא־מתודות אחרות של אופרטורים, נהוג לכתוב את __concat עם נקודה, והיא מקבלת את שני האופרנדים כארגומנטים. ההבדל העיקרי ממטא־מתודות חשבוניות הוא שבדרך כלל עובדים עם טיפוסים מעורבים: האובייקט שלך ומחרוזת.
אתגר
קלבואו נבנה מחלקה Title שיכולה להשתלב באופן טבעי בביטויי מחרוזות באמצעות האופרטור ... זה שימושי כשרוצים לשלב אובייקטים עם מחרוזות בצורה קריאה ואינטואיטיבית, למשל בהוספת תארי כבוד או סיומות לתואר של אדם.
תארגנו את הקוד בשני קבצים:
Title.lua: הגדירו את המחלקהTitleשלכם עם שדהtextששומר את מחרוזת התואר. כללו בנאי:new(text)וממשו את המטאמֵתודה__concat. המטאמֵתודה שלכם צריכה לטפל בשני המקרים: כאשר מחרוזת מופיעה לפני האובייקט ("prefix" .. obj) וכאשר מחרוזת מופיעה אחריו (obj .. "suffix"). התוצאה צריכה לשלב את המחרוזת עם הטקסט של התואר בהתאם.main.lua: טענו את המודולTitle, צרו מופע של התואר והדגימו שרשור בשני הכיוונים.
תקבלו שלוש קלטים:
- טקסט התואר (למשל, "Engineer")
- מחרוזת קידומת להצבה לפני התואר (למשל, "Senior ")
- מחרוזת סיומת להצבה אחרי התואר (למשל, " III")
בקובץ הראשי שלכם, צרו Title עם הטקסט הנתון. לאחר מכן בצעו שתי פעולות שרשור והדפיסו כל תוצאה בשורה נפרדת:
- שרשרו את מחרוזת הקידומת עם אובייקט התואר
- שרשרו את אובייקט התואר עם מחרוזת הסיומת
לדוגמה, אם הקלט הוא Engineer, Senior ו- III, הפלט צריך להיות:
Senior Engineer
Engineer IIIהשורה הראשונה מציגה את הקידומת המשולבת עם התואר, והשורה השנייה מציגה את התואר המשולב עם הסיומת. המטאמֵתודה __concat שלכם מאפשרת את השילוב הטבעי הזה של מחרוזות!
נסו בעצמכם
-- קראו את הקלטים
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- טענו את המודול Title באמצעות require
local Title = require('Title')
-- TODO: צרו מופע של Title עם titleText הנתון
-- TODO: שרשרו את prefix לאובייקט הכותרת והדפיסו את התוצאה
-- TODO: שרשרו את אובייקט הכותרת ל-suffix והדפיסו את התוצאה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין