Menu
CoddyTech

שרשור אובייקטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 עם נקודה, והיא מקבלת את שני האופרנדים כארגומנטים. ההבדל העיקרי ממטא־מתודות חשבוניות הוא שבדרך כלל עובדים עם טיפוסים מעורבים: האובייקט שלך ומחרוזת.

challenge icon

אתגר

קל

בואו נבנה מחלקה Title שיכולה להשתלב באופן טבעי בביטויי מחרוזות באמצעות האופרטור ... זה שימושי כשרוצים לשלב אובייקטים עם מחרוזות בצורה קריאה ואינטואיטיבית, למשל בהוספת תארי כבוד או סיומות לתואר של אדם.

תארגנו את הקוד בשני קבצים:

  • Title.lua: הגדירו את המחלקה Title שלכם עם שדה text ששומר את מחרוזת התואר. כללו בנאי :new(text) וממשו את המטאמֵתודה __concat. המטאמֵתודה שלכם צריכה לטפל בשני המקרים: כאשר מחרוזת מופיעה לפני האובייקט ("prefix" .. obj) וכאשר מחרוזת מופיעה אחריו (obj .. "suffix"). התוצאה צריכה לשלב את המחרוזת עם הטקסט של התואר בהתאם.
  • main.lua: טענו את המודול Title, צרו מופע של התואר והדגימו שרשור בשני הכיוונים.

תקבלו שלוש קלטים:

  1. טקסט התואר (למשל, "Engineer")
  2. מחרוזת קידומת להצבה לפני התואר (למשל, "Senior ")
  3. מחרוזת סיומת להצבה אחרי התואר (למשל, " III")

בקובץ הראשי שלכם, צרו Title עם הטקסט הנתון. לאחר מכן בצעו שתי פעולות שרשור והדפיסו כל תוצאה בשורה נפרדת:

  1. שרשרו את מחרוזת הקידומת עם אובייקט התואר
  2. שרשרו את אובייקט התואר עם מחרוזת הסיומת

לדוגמה, אם הקלט הוא 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 והדפיסו את התוצאה
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין