Вычитание объектов
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 27 из 70.
Так же как __add обрабатывает оператор +, метаметод __sub определяет поведение для оператора -. Шаблон идентичен. Вы определяете функцию, которая получает два операнда и возвращает новый объект.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endПри работе с цветами RGB вычитание может привести к отрицательным значениям. В реальных приложениях может потребоваться ограничить resulting результаты допустимыми диапазонами (0-255), но основная структура metamethod остаётся такой же.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Вывод: 150 120 80Remember: определите __sub с помощью dot (не двоеточия), поскольку это metamethod, который Lua вызывает напрямую с обоими operands в качестве аргументов.
Задание
ЛегкоДавайте создадим класс Color, поддерживающий вычитание с помощью - operator. Цвета представлены значениями RGB, а вычитание одного цвета из другого создаёт новый цвет с разностью каждого component.
Вы организуете код в двух файлах:
Color.lua: Define ваш класс Color с компонентамиr,gиb, представляющими значения красного, зелёного и синего цветов. Включите constructor:new(r, g, b)и реализуйте metamethod__sub, чтобы вычитание двух цветов создавало новый цвет с покомпонентными differences. Remember, что__subиспользует синтаксис через точку и receives оба operands в качестве аргументов.main.lua: Require ваш модуль Color, create экземпляры цвета из предоставленных входных данных, вычтите их и выведите resulting значения RGB.
Вы получите шесть входных значений:
- Красный component первого цвета
- Зелёный component первого цвета
- Синий component первого цвета
- Красный component второго цвета
- Зелёный component второго цвета
- Синий component второго цвета
В основном файле create два цвета с given значениями RGB, вычтите second цвет из first с помощью - operator и выведите значения r, g и b resulting цвета в отдельных строках.
Например, если входные данные — 200, 150, 100, 50, 30, 20, результатом должен быть:
150
120
80Первый цвет (200, 150, 100) минус second цвет (50, 30, 20) равен новому цвету (150, 120, 80).
REQUIRED OUTPUT FORMAT:Попробуйте сами
-- Подключить модуль Color
local Color = require('Color')
-- Прочитать входные значения
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Создать два экземпляра Color с заданными значениями RGB
-- TODO: Вычесть второй цвет из первого с помощью оператора -
-- TODO: Вывести значения r, g и b результирующего цвета на отдельных строках
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua