Menu
Coddy logo textTech

Łączenie obiektów

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 28 z 70.

Operator .. w Lua łączy ciągi znaków, ale co zrobić, jeśli chcesz połączyć obiekt z ciągiem znaków? Metoda metatabeli __concat pozwala dokładnie określić, jak ma to działać.

Gdy Lua napotyka a .. b i jeden z operandów ma metametodę __concat, wywołuje tę funkcję z obiema wartościami. Jest to przydatne, gdy chcesz, aby obiekty naturalnie wpasowywały się w wyrażenia tekstowe.

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

Zwróć uwagę, że funkcja sprawdza, który operand jest ciągiem znaków. Ponieważ .. można użyć jako "Hello " .. obj lub obj .. "!", Twoja metoda metatablicy powinna obsługiwać oba przypadki.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Wynik: Dr. Ada Lovelace
print(person .. " PhD")      -- Wynik: Ada Lovelace PhD

Podobnie jak inne metametody operatorów, __concat używa składni kropkowej i otrzymuje oba operandy jako argumenty. Kluczowa różnica w porównaniu z metametodami arytmetycznymi polega na tym, że zazwyczaj pracujesz z różnymi typami. Twoim obiektem i ciągiem znaków.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Title, która może naturalnie łączyć się z wyrażeniami tekstowymi za pomocą operatora ... Jest to przydatne, gdy chcesz łączyć obiekty z tekstem w czytelny i intuicyjny sposób, na przykład dodając przedrostki lub przyrostki do tytułu danej osoby.

Podzielisz kod na dwa pliki:

  • Title.lua: Zdefiniuj klasę Title z polem text, które przechowuje tekst tytułu. Dodaj konstruktor :new(text) i zaimplementuj metametodę __concat. Metametoda powinna obsługiwać oba przypadki: gdy tekst znajduje się przed obiektem ("prefix" .. obj) oraz gdy tekst znajduje się za nim (obj .. "suffix"). Wynik powinien odpowiednio łączyć tekst z tekstem tytułu.
  • main.lua: Załaduj moduł Title, utwórz instancję tytułu i pokaż konkatenację w obu kierunkach.

Otrzymasz trzy dane wejściowe:

  1. Tekst tytułu (np. "Engineer")
  2. Tekst przedrostka, który ma znaleźć się przed tytułem (np. "Senior ")
  3. Tekst przyrostka, który ma znaleźć się za tytułem (np. " III")

W pliku głównym utwórz obiekt Title z podanym tekstem. Następnie wykonaj dwie konkatenacje i wypisz każdy wynik w osobnym wierszu:

  1. Połącz tekst przedrostka z obiektem tytułu
  2. Połącz obiekt tytułu z tekstem przyrostka

Na przykład, jeśli dane wejściowe to Engineer, Senior i III, wynikiem powinno być:

Senior Engineer
Engineer III

Pierwszy wiersz pokazuje przedrostek połączony z tytułem, a drugi wiersz pokazuje tytuł połączony z przyrostkiem. Metametoda __concat umożliwia takie naturalne łączenie tekstu!

Spróbuj swoich sił

-- Wczytaj dane wejściowe
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

-- Załaduj moduł Title
local Title = require('Title')

-- TODO: Utwórz instancję Title z podanym titleText

-- TODO: Połącz prefix z obiektem title i wypisz wynik

-- TODO: Połącz obiekt title z suffix i wypisz wynik
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online