Porównywanie obiektów (<, >)
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 29 z 70.
Poza arytmetyką i konkatenacją możesz również określić, jak obiekty są porównywane ze sobą, używając metametod porównania. Metametoda __lt obsługuje operator „mniejsze niż” (<).
Gdy Lua oblicza a < b, szuka __lt w metatabeli. Ta metametoda powinna zwracać true lub false, zależnie od logiki porównania.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
endPo zdefiniowaniu __lt możesz teraz bezpośrednio porównywać elementy:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Wynik: true
print(laptop < apple) -- Wynik: falseOto sprytny trik: Lua automatycznie wyprowadza operator > z __lt. Kiedy zapisujesz a > b, Lua po prostu oblicza zamiast tego b < a. Zatem zdefiniowanie samego __lt zapewnia obie strony porównania za darmo.
Wyzwanie
ŁatwyZbudujmy klasę Product, którą można porównywać za pomocą operatorów < i > na podstawie ceny. Przyda się to w sytuacjach takich jak sortowanie produktów w koszyku lub znajdowanie najtańszej opcji na liście.
Rozmieścisz kod w dwóch plikach:
Product.lua: Zdefiniuj klasę Product z polaminameiprice. Dodaj konstruktor:new(name, price)i zaimplementuj metametodę__lt, aby porównywać produkty według ich ceny. Pamiętaj, że zdefiniowanie__ltautomatycznie udostępnia również operator>: Lua zajmie się tym za Ciebie!main.lua: Załaduj moduł Product, utwórz instancje produktów na podstawie danych wejściowych i porównaj je, aby ustalić, który kosztuje więcej lub mniej.
Otrzymasz cztery dane wejściowe:
- Nazwa pierwszego produktu
- Cena pierwszego produktu
- Nazwa drugiego produktu
- Cena drugiego produktu
W głównym pliku utwórz dwa produkty z podanymi nazwami i cenami. Następnie wykonaj trzy porównania i wypisz wynik każdego z nich w osobnej linii:
- Czy pierwszy produkt jest tańszy od drugiego? (wypisz
truelubfalse) - Czy pierwszy produkt jest droższy od drugiego? (wypisz
truelubfalse) - Wypisz nazwę tańszego produktu
Na przykład, jeśli dane wejściowe to Apple, 2, Laptop i 999, wynik powinien wyglądać tak:
true
false
AppleApple (cena 2) jest tańsze od Laptopa (cena 999), więc wynik pierwszego porównania to true. Apple nie jest droższe od Laptopa, więc wynik drugiego porównania to false. A ponieważ Apple ma niższą cenę, zostaje wypisane jako tańszy produkt.
Spróbuj swoich sił
-- Załaduj moduł Product
local Product = require('Product')
-- Odczytaj dane wejściowe
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- TODO: Utwórz dwie instancje Product za pomocą Product:new()
-- TODO: Porównaj produkty za pomocą operatora < i wypisz true/false
-- TODO: Porównaj produkty za pomocą operatora > i wypisz true/false
-- TODO: Wypisz nazwę tańszego produktu
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