Menu
CoddyTech

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 trata 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 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 com dois-pontos), pois é um metamétodo que Lua chama diretamente com os dois operandos como argumentos.

challenge icon

Desafio

Fácil

Vamos criar uma classe Color que permite 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, 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 de cada componente. Lembre-se de que __sub usa a sintaxe com ponto e recebe os dois operandos como argumentos.
  • main.lua: Importe seu módulo Color, crie instâncias de cor 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 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

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

-- Leia 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