Menu
Coddy logo textTech

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

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

Remember: определите __sub с помощью dot (не двоеточия), поскольку это metamethod, который Lua вызывает напрямую с обоими operands в качестве аргументов.

challenge icon

Задание

Легко

Давайте создадим класс 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.

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

  1. Красный component первого цвета
  2. Зелёный component первого цвета
  3. Синий component первого цвета
  4. Красный component второго цвета
  5. Зелёный component второго цвета
  6. Синий 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: [Your translated content here]

Попробуйте сами

-- Подключить модуль 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