Menu
Coddy logo textTech

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 .. ")"
end

Teraz, 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ę.

challenge icon

Wyzwanie

Łatwy

Stwó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ę Book przy użyciu standardowego wzorca prototypu. Każda książka powinna przechowywać title i author. 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:

  1. Tytuł pierwszej książki
  2. Autor pierwszej książki
  3. Tytuł drugiej książki
  4. 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 Orwell

Pamię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))

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