Сравнение объектов (<, >)
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 29 из 70.
Помимо арифметики и конкатенации, вы также можете определить, как объекты сравниваются друг с другом, используя метаметоды сравнения. Метаметод __lt обрабатывает оператор «меньше чем» (<code><).
Когда 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 дает вам оба направления сравнения бесплатно.
Задание
ЛегкоДавайте создадим класс Product, который можно сравнивать с помощью операторов <code>< и на основе цены. Это идеально подходит для таких сценариев, как сортировка товаров в корзине или поиск самого дешевого варианта в списке.
Вы организуете свой код в двух файлах:
Product.lua: Определите класс Product с полямиnameиprice. Включите конструктор:new(name, price)и реализуйте метаметод__ltдля сравнения продуктов по их цене. Помните, что определение__ltавтоматически дает вам и оператор— Lua берет это на себя!main.lua: Подключите модуль Product, создайте экземпляры продуктов из входных данных и сравните их, чтобы определить, какой из них стоит больше или меньше.
Вы получите четыре входных значения:
- Название первого продукта
- Цена первого продукта
- Название второго продукта
- Цена второго продукта
В вашем основном файле создайте два продукта с заданными именами и ценами. Затем выполните три сравнения и выведите результат каждого на отдельной строке:
- Первый продукт меньше второго? (выведите
trueилиfalse) - Первый продукт больше второго? (выведите
trueилиfalse) - Выведите название более дешевого продукта
Например, если входные данные — Apple, 2, Laptop и 999, вывод должен быть следующим:
true
false
AppleApple (цена 2) меньше, чем Laptop (цена 999), поэтому первое сравнение — true. Apple не больше, чем Laptop, поэтому второе — false. И так как у Apple цена ниже, оно выводится как более дешевый продукт.
Шпаргалка
Метаметод __lt обрабатывает оператор «меньше» (<code><) для пользовательских объектов.
Когда 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) -- Результат: falseLua автоматически выводит оператор из __lt. Когда вы пишете a > b, Lua вместо этого вычисляет b < a. Определение только __lt дает вам оба направления сравнения.
Попробуйте сами
-- Подключить модуль 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: Вывести название более дешевого продукта
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур