Вычитание объектов
Часть раздела Object Oriented Programming путешествия по 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).
Шпаргалка
Метаметод __sub определяет поведение для оператора -. Он принимает два операнда и возвращает новый объект.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endОпределяйте __sub через точку (а не двоеточие), так как это метаметод, который Lua вызывает напрямую, передавая оба операнда в качестве аргументов.
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Попробуйте сами
-- Подключить модуль 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 результирующего цвета на отдельных строках
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур