Menu
Coddy logo textTech

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

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