Łą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
endZwróć 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 PhDPodobnie 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.
Wyzwanie
ŁatwyZbudujmy 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 polemtext, 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:
- Tekst tytułu (np. "Engineer")
- Tekst przedrostka, który ma znaleźć się przed tytułem (np. "Senior ")
- 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:
- Połącz tekst przedrostka z obiektem tytułu
- 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 IIIPierwszy 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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtówPoćwicz samodzielnie: Kompilator Lua online