Сравнение объектов (<, >)
Часть раздела Объектно-ориентированное программирование путешествия по 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 бесплатно даёт вам оба направления сравнения.
Задание
ЛегкоДавайте создадим 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:
- Имя первого product
- Цена первого product
- Имя второго product
- Цена второго product
В вашем основном файле Create два products с заданными именами и ценами. Затем выполните три сравнения и Print результат каждого в отдельной строке:
- Меньше ли первый product второго? (Print
trueилиfalse) - Больше ли первый product второго? (Print
trueилиfalse) - Print имя более дешёвого product
Например, если inputs равны Apple, 2, Laptop и 999, Output должен быть таким:
true
false
AppleApple (цена 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: Вывести имя более дешёвого продукта
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua