Restar objetos
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 27 de 70.
Al igual que __add maneja el operador +, el metamétodo __sub define el comportamiento para el operador -. El patrón es idéntico: defines una función que recibe dos operandos y devuelve un nuevo 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)
endAl trabajar con colores RGB, la resta puede producir valores negativos. En aplicaciones reales, es posible que desees limitar los resultados a rangos válidos (0-255), pero la estructura central del metamétodo sigue siendo la misma.
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) -- Salida: 150 120 80Recuerda: define __sub con un punto (no dos puntos), ya que es un metamétodo que Lua llama directamente con ambos operandos como argumentos.
Desafío
FácilVamos a construir una clase Color que admita la resta utilizando el operador -. Los colores se representan mediante valores RGB, y restar un color de otro crea un nuevo color con la diferencia de cada componente.
Organizarás tu código en dos archivos:
Color.lua: Define tu clase Color con los componentesr,gybque representan los valores de rojo, verde y azul. Incluye un constructor:new(r, g, b)e implementa el metamétodo__subpara que al restar dos colores se cree un nuevo color con las diferencias de cada componente. Recuerda que__subutiliza la sintaxis de punto y recibe ambos operandos como argumentos.main.lua: Requiere tu módulo Color, crea instancias de color a partir de las entradas proporcionadas, réstalas y muestra los valores RGB resultantes.
Recibirás seis entradas:
- Componente rojo del primer color
- Componente verde del primer color
- Componente azul del primer color
- Componente rojo del segundo color
- Componente verde del segundo color
- Componente azul del segundo color
En tu archivo principal, crea dos colores con los valores RGB dados, resta el segundo color del primero usando el operador - e imprime los valores r, g y b del color resultante en líneas separadas.
Por ejemplo, si las entradas son 200, 150, 100, 50, 30, 20, la salida debería ser:
150
120
80El primer color (200, 150, 100) menos el segundo color (50, 30, 20) es igual a un nuevo color (150, 120, 80).
Hoja de referencia
El metamétodo __sub define el comportamiento para el operador -. Recibe dos operandos y devuelve un nuevo objeto.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endDefine __sub con un punto (no dos puntos), ya que es un metamétodo que Lua llama directamente con ambos 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) -- Salida: 150 120 80Pruébalo tú mismo
-- Requerir el módulo Color
local Color = require('Color')
-- Leer los 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: Crear dos instancias de Color con los valores RGB dados
-- TODO: Restar el segundo color del primero usando el operador -
-- TODO: Imprimir los valores r, g y b del color resultante en líneas separadas
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas