שרשור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין