Menu
CoddyTech

Вычитание объектов

Часть раздела Объектно-ориентированное программирование путешествия по 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 вызывает напрямую, передавая оба операнда в качестве аргументов.

challenge icon

Задание

Легко

Давайте создадим класс Color, поддерживающий вычитание с помощью оператора -. Цвета представлены значениями RGB, а вычитание одного цвета из другого создаёт новый цвет с разностью каждого компонента.

Вы разместите код в двух файлах:

  • Color.lua: Определите класс Color с компонентами r, g и b, представляющими значения красного, зелёного и синего цветов. Добавьте конструктор :new(r, g, b) и реализуйте метаметод __sub, чтобы вычитание двух цветов создавало новый цвет с разностью соответствующих компонентов. Помните, что __sub использует точечный синтаксис и получает оба операнда в качестве аргументов.
  • main.lua: Подключите модуль Color, создайте экземпляры цветов на основе предоставленных входных данных, вычтите один цвет из другого и выведите полученные значения RGB.

Вы получите шесть входных значений:

  1. Красная компонента первого цвета
  2. Зелёная компонента первого цвета
  3. Синяя компонента первого цвета
  4. Красная компонента второго цвета
  5. Зелёная компонента второго цвета
  6. Синяя компонента второго цвета

В главном файле создайте два цвета с заданными значениями 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 полученного цвета на отдельных строках
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua