Menu
Coddy logo textTech

Subtraindo Objetos

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 27 de 70.

Assim como __add lida com o operador +, o metamétodo __sub define o comportamento do operador -. O padrão é idêntico. Você define uma função que recebe dois operandos e retorna um novo objeto.

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

Ao trabalhar com cores RGB, a subtração pode produzir valores negativos. Em aplicações reais, talvez você queira limitar os resultados a intervalos válidos (0-255), mas a estrutura principal do metamétodo permanece a mesma.

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)  -- Saída: 150  120  80

Lembre-se: defina __sub com um ponto (não com dois-pontos), pois ele é um metamétodo que Lua chama diretamente com ambos os operandos como argumentos.

challenge icon

Desafio

Fácil

Vamos criar uma classe Color que permite subtração usando o operador -. As cores são representadas por valores RGB, e subtrair uma cor de outra cria uma nova cor com a diferença de cada componente.

Você organizará seu código em dois arquivos:

  • Color.lua: defina sua classe Color com os componentes r, g e b, que representam os valores de vermelho, verde e azul. Inclua um construtor :new(r, g, b) e implemente o metamétodo __sub para que subtrair duas cores crie uma nova cor com as diferenças componente a componente. Lembre-se de que __sub usa a sintaxe com ponto e recebe ambos os operandos como argumentos.
  • main.lua: exija seu módulo Color, crie instâncias de cores a partir das entradas fornecidas, subtraia-as e exiba os valores RGB resultantes.

Você receberá seis entradas:

  1. Componente vermelho da primeira cor
  2. Componente verde da primeira cor
  3. Componente azul da primeira cor
  4. Componente vermelho da segunda cor
  5. Componente verde da segunda cor
  6. Componente azul da segunda cor

Em seu arquivo principal, crie duas cores com os valores RGB fornecidos, subtraia a segunda cor da primeira usando o operador - e imprima os valores r, g e b da cor resultante em linhas separadas.

Por exemplo, se as entradas forem 200, 150, 100, 50, 30, 20, a saída deverá ser:

150
120
80

A primeira cor (200, 150, 100) menos a segunda cor (50, 30, 20) resulta em uma nova cor (150, 120, 80).

Experimente você mesmo

-- Requer o módulo Color
local Color = require('Color')

-- Lê os valores de entrada
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: Crie duas instâncias de Color com os valores RGB fornecidos

-- TODO: Subtraia a segunda cor da primeira usando o operador -

-- TODO: Imprima os valores r, g e b da cor resultante em linhas separadas
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online