Вычитание объектов
Часть раздела Объектно-ориентированное программирование путешествия по 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 вычитание может приводить к отрицательным значениям. В реальных приложениях может понадобиться ограничивать результаты допустимым диапазоном (0-255), но основная структура метаметода остаётся прежней.
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 80Помни: определяй __sub через точку (не через двоеточие), поскольку это метаметод, который Lua вызывает напрямую, передавая оба операнда в качестве аргументов.
Задание
ЛегкоДавайте создадим класс Color, поддерживающий вычитание с помощью оператора -. Цвета представлены значениями RGB, а вычитание одного цвета из другого создаёт новый цвет с разностью каждого компонента.
Вы разместите код в двух файлах:
Color.lua: Определите класс Color с компонентамиr,gиb, представляющими значения красного, зелёного и синего цветов. Добавьте конструктор:new(r, g, b)и реализуйте метаметод__sub, чтобы вычитание двух цветов создавало новый цвет с разностью соответствующих компонентов. Помните, что__subиспользует точечный синтаксис и получает оба операнда в качестве аргументов.main.lua: Подключите модуль Color, создайте экземпляры цветов на основе предоставленных входных данных, вычтите один цвет из другого и выведите полученные значения RGB.
Вы получите шесть входных значений:
- Красная компонента первого цвета
- Зелёная компонента первого цвета
- Синяя компонента первого цвета
- Красная компонента второго цвета
- Зелёная компонента второго цвета
- Синяя компонента второго цвета
В главном файле создайте два цвета с заданными значениями RGB, вычтите второй цвет из первого с помощью оператора - и выведите значения r, g и b полученного цвета, каждое на отдельной строке.
Например, если входные данные — это 200, 150, 100, 50, 30, 20, результат должен быть таким:
150
120
80Первый цвет (200, 150, 100) минус второй цвет (50, 30, 20) равен новому цвету (150, 120, 80).
Попробуйте сами
-- Подключить модуль 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