Restar objetos
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 27 de 70.
Al igual que __add gestiona el operador +, el método metamágico __sub define el comportamiento del operador -. El patrón es idéntico. Defines una función que recibe dos operandos y devuelve un objeto nuevo.
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 quieras 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 con dos puntos), ya que es un metamétodo que Lua llama directamente con ambos operandos como argumentos.
Desafío
FácilConstruyamos una clase Color que admita la resta mediante 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,gyb, que representan los valores rojo, verde y azul. Incluye un constructor:new(r, g, b)e implementa el método metamágico__subpara que restar dos colores cree un nuevo color con las diferencias componente a componente. Recuerda que__subusa la sintaxis con punto y recibe ambos operandos como argumentos.main.lua: Requiere tu módulo Color, crea instancias de color a partir de las entradas proporcionadas, las resta 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 indicados, 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).
Pruébalo tú mismo
-- Requiere el módulo Color
local Color = require('Color')
-- Lee 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: Crea dos instancias de Color con los valores RGB dados
-- TODO: Resta el segundo color del primero usando el operador -
-- TODO: Imprime 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 Programación Orientada a Objetos
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 formasPractica por tu cuenta: Compilador de Lua online