Menu
Coddy logo textTech

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
end

Po 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: false

Oto 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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 polami name i price. Dodaj konstruktor :new(name, price) i zaimplementuj metametodę __lt, aby porównywać produkty według ich ceny. Pamiętaj, że zdefiniowanie __lt automatycznie 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:

  1. Nazwa pierwszego produktu
  2. Cena pierwszego produktu
  3. Nazwa drugiego produktu
  4. 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:

  1. Czy pierwszy produkt jest tańszy od drugiego? (wypisz true lub false)
  2. Czy pierwszy produkt jest droższy od drugiego? (wypisz true lub false)
  3. 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
Apple

Apple (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
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