Menu
Coddy logo textTech

Subtraindo Objetos

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 27 de 70.

Assim como o __add lida com o operador +, o metamétodo __sub define o comportamento para o 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, você pode querer limitar os resultados a intervalos válidos (0-255), mas a estrutura central 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 dois-pontos), já que é um metamétodo que o Lua chama diretamente com ambos os operandos como argumentos.

challenge icon

Desafio

Fácil

Vamos construir uma classe Color que suporte a 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 representando os valores de vermelho, verde e azul. Inclua um construtor :new(r, g, b) e implemente o metamétodo __sub para que a subtração de duas cores crie uma nova cor com as diferenças de cada componente. Lembre-se de que __sub usa a sintaxe de ponto e recebe ambos os operandos como argumentos.
  • main.lua: Importe 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

No 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 deve ser:

150
120
80

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

Folha de consulta

O metamétodo __sub define o comportamento para o operador -. Ele recebe dois operandos e retorna um novo objeto.

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

Defina __sub com um ponto (não dois pontos), pois é um metamétodo que o Lua chama diretamente com ambos os operandos como argumentos.

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)  -- Output: 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: Criar duas instâncias de Color com os valores RGB fornecidos

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

-- TODO: Imprimir 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 Object Oriented Programming