Menu
Coddy logo textTech

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

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

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

Когда Lua вычисляет a < b, он ищет __lt в метатаблице. Этот metamethod должен возвращать 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 automatically выводит оператор из __lt. Когда вы пишете a > b, Lua просто вычисляет вместо этого b < a. Поэтому определение только __lt бесплатно даёт вам оба направления сравнения.

challenge icon

Задание

Легко

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

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

  • Product.lua: Define свой Product class с полями name и price. Включите конструктор :new(name, price) и Implement metamethod __lt для сравнения products по их цене. Помните, что Define __lt автоматически предоставляет также оператор : Lua позаботится об этом за вас!
  • main.lua: Require свой Product module, Create instances products из inputs и сравните их, чтобы определить, какой из них стоит больше или меньше.

Вы получите четыре inputs:

  1. Имя первого product
  2. Цена первого product
  3. Имя второго product
  4. Цена второго product

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

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

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

true
false
Apple

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

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

-- Подключить модуль 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