Menu
Coddy logo textTech

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)
end

Al 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  80

Recuerda: define __sub con un punto (no dos puntos), ya que es un metamétodo que Lua llama directamente con ambos operandos como argumentos.

challenge icon

Desafío

Fácil

Vamos 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 componentes r, g y b que representan los valores de rojo, verde y azul. Incluye un constructor :new(r, g, b) e implementa el metamétodo __sub para que al restar dos colores se cree un nuevo color con las diferencias de cada componente. Recuerda que __sub utiliza 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:

  1. Componente rojo del primer color
  2. Componente verde del primer color
  3. Componente azul del primer color
  4. Componente rojo del segundo color
  5. Componente verde del segundo color
  6. 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
80

El 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)
end

Define __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  80

Prué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
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming