Menu
CoddyTech

Сравнение объектов (<, >)

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 29 из 70.

Помимо арифметики и конкатенации, вы также можете определить, как объекты сравниваются друг с другом, используя метаметоды сравнения. Метаметод __lt обрабатывает оператор «меньше чем» (<).

Когда Lua вычисляет a < b, он ищет __lt в метатаблице. Этот метаметод должен возвращать true или false в зависимости от вашей логики сравнения.

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

Определив __lt, теперь можно напрямую сравнивать элементы:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop)   -- Вывод: true
print(laptop < apple)   -- Вывод: false

Вот что особенно умно: Lua автоматически выводит оператор > из __lt. Когда вы пишете a > b, Lua просто вычисляет вместо этого b < a. Поэтому, определив только __lt, вы бесплатно получаете оба направления сравнения.

challenge icon

Задание

Легко

Давайте создадим класс Product, экземпляры которого можно сравнивать с помощью операторов < и > по цене. Это идеально подходит для таких задач, как сортировка товаров в корзине или поиск самого дешёвого варианта в списке.

Вы организуете код в двух файлах:

  • Product.lua: определите класс Product с полями name и price. Добавьте конструктор :new(name, price) и реализуйте метаметод __lt для сравнения товаров по их цене. Помните, что определение __lt автоматически предоставляет вам и оператор >: Lua позаботится об этом за вас!
  • main.lua: подключите модуль Product, создайте экземпляры товаров на основе входных данных и сравните их, чтобы определить, какой из них стоит больше или меньше.

Вы получите четыре входных значения:

  1. Название первого товара
  2. Цена первого товара
  3. Название второго товара
  4. Цена второго товара

В основном файле создайте два товара с указанными названиями и ценами. Затем выполните три сравнения и выведите результат каждого в отдельной строке:

  1. Меньше ли первый товар второго? (выведите true или false)
  2. Больше ли первый товар второго? (выведите true или false)
  3. Выведите название более дешёвого товара

Например, если входные данные — Apple, 2, Laptop и 999, результат должен быть таким:

true
false
Apple

Apple (цена 2) стоит меньше, чем Laptop (цена 999), поэтому результат первого сравнения — true. Apple не стоит дороже Laptop, поэтому результат второго сравнения — false. А поскольку цена Apple ниже, он выводится как более дешёвый товар.

REQUIRED OUTPUT FORMAT: [Your translated content here]

Попробуйте сами

-- Подключить модуль Product
local Product = require('Product')

-- Прочитать входные данные
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Создать два экземпляра Product с помощью Product:new()

-- TODO: Сравнить продукты с помощью оператора < и вывести true/false

-- TODO: Сравнить продукты с помощью оператора > и вывести true/false

-- TODO: Вывести название более дешёвого продукта
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua