Łą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 metatablicy __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. Przydaje się to, gdy chcesz, aby obiekty naturalnie pasowały do wyrażeń łańcuchowych.
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
endZauważ, że funkcja sprawdza, który operand jest łańcuchem znaków. Ponieważ .. można użyć jako "Hello " .. obj lub obj .. "!", Twoja metametoda 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 zapisuje się konwencjonalnie z kropkami, a jako argumenty otrzymuje oba operandy. Kluczowa różnica w porównaniu z arytmetycznymi metametodami polega na tym, że zazwyczaj pracujesz z różnymi typami: swoim obiektem i ciągiem znaków.
Wyzwanie
ŁatwyZbudujmy klasę Title, która może naturalnie włączać się do wyrażeń łańcuchowych za pomocą operatora ... Przydaje się to, gdy chcesz łączyć obiekty z łańcuchami znaków w czytelny i intuicyjny sposób, na przykład dodając formy grzecznościowe lub przyrostki do tytułu danej osoby.
Podzielisz swój 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 łańcuch znaków występuje przed obiektem ("prefix" .. obj) oraz gdy łańcuch znaków występuje po obiekcie (obj .. "suffix"). Wynik powinien odpowiednio łączyć łańcuch znaków 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")
- Łańcuch znaków prefiksu, który należy umieścić przed tytułem (np. "Senior ")
- Łańcuch znaków przyrostka, który należy umieścić po tytule (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 łańcuch znaków prefiksu z obiektem tytułu
- Połącz obiekt tytułu z łańcuchem znaków przyrostka
Na przykład, jeśli dane wejściowe to Engineer, Senior i III, wynikiem powinno być:
Senior Engineer
Engineer IIIPierwszy wiersz pokazuje prefiks połączony z tytułem, a drugi wiersz pokazuje tytuł połączony z przyrostkiem. Metametoda __concat umożliwia takie naturalne łączenie łańcuchów znaków!
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 tytułu i wypisz wynik
-- TODO: Połącz obiekt tytułu 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