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)
endAo 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 80Lembre-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.
Desafio
FácilVamos 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 componentesr,gebrepresentando os valores de vermelho, verde e azul. Inclua um construtor:new(r, g, b)e implemente o metamétodo__subpara que a subtração de duas cores crie uma nova cor com as diferenças de cada componente. Lembre-se de que__subusa 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:
- Componente vermelho da primeira cor
- Componente verde da primeira cor
- Componente azul da primeira cor
- Componente vermelho da segunda cor
- Componente verde da segunda cor
- 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
80A 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)
endDefina __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 80Experimente 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
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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas