Menu
Coddy logo textTech

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

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

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).

Шпаргалка

Метаметод __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 результирующего цвета на отдельных строках
quiz iconПроверьте себя

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

Все уроки раздела Object Oriented Programming