Formatowanie ciągów znaków
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 16 z 70.
Gdy bezpośrednio wyświetlasz obiekt, Lua pokazuje coś mało przydatnego, na przykład table: 0x55a.... To tylko adres pamięci. Metametoda __tostring pozwala dokładnie określić, jaki ciąg znaków reprezentuje twój obiekt, gdy jest wyświetlany lub konwertowany na tekst.
We wzorcu klasy dodajesz __tostring jako funkcję w tabeli swojej klasy. Ponieważ sama klasa pełni rolę metatabeli dla instancji, Lua automatycznie znajduje i używa tej funkcji:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endTeraz, gdy wyświetlasz instancję Player, Lua automatycznie wywołuje metodę __tostring:
local hero = Player:new("Luna", 5)
print(hero) -- Wynik: Player: Luna (Level 5)Zauważ, że __tostring używa składni z dwukropkiem i otrzymuje self, co daje dostęp do wszystkich danych instancji. Funkcja musi zwracać ciąg znaków. Możesz sformatować go w dowolny sensowny dla swojego obiektu sposób, łącząc dowolne atrybuty w czytelną reprezentację.
Wyzwanie
ŁatwyStwórzmy klasę Book, która potrafi się przedstawić! Gdy bezpośrednio wyświetlisz książkę, Lua pokaże ładnie sformatowany tekst zamiast tajemniczego adresu pamięci — a wszystko dzięki met方法odzie metatabeli __tostring.
Podzielisz swój kod na dwa pliki:
Book.lua: Zdefiniuj klasęBookprzy użyciu standardowego wzorca prototypu. Każda książka powinna przechowywaćtitleiauthor. Dodaj konstruktor:new(title, author)i zaimplementuj metametodę__tostring, aby wyświetlenie książki prezentowało jej informacje w czytelnym formacie.main.lua: Załaduj moduł Book, utwórz instancje książek i wyświetl je bezpośrednio, aby zobaczyć działanie własnego formatowania tekstu.
Twoja metoda __tostring powinna zwracać tekst dokładnie w tym formacie:
"[title]" by [author]Zwróć uwagę, że w zwracanym tekście tytuł jest ujęty w podwójny cudzysłów.
Otrzymasz cztery dane wejściowe:
- Tytuł pierwszej książki
- Autor pierwszej książki
- Tytuł drugiej książki
- Autor drugiej książki
W pliku głównym utwórz dwie książki na podstawie podanych danych wejściowych i wyświetl każdą z nich bezpośrednio (nie wywołując metody — po prostu print(book)). Każda książka powinna pojawić się w osobnym wierszu.
Na przykład, jeśli dane wejściowe to The Hobbit, J.R.R. Tolkien, 1984 i George Orwell, wynik powinien wyglądać tak:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellPamiętaj, że __tostring musi zwracać tekst, a ponieważ tabela klasy służy jako metatabela instancji, Lua automatycznie znajdzie i użyje funkcji __tostring, gdy wyświetlisz książkę.
Spróbuj swoich sił
-- Załaduj moduł Book
local Book = require('Book')
-- Odczytaj dane wejściowe
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Utwórz dwie instancje książki za pomocą Book:new()
-- TODO: Wypisz każdą książkę bezpośrednio (użyj po prostu print(book))
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