Menu
Coddy logo textTech

Comprobaciones de Igualdad

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 17 de 70.

Has visto cómo __tostring controla la forma en que un objeto se muestra. Otro metamétodo útil es __eq, que define cuándo se deben considerar iguales dos objetos mediante el operador ==.

De forma predeterminada, comparar dos tablas con == comprueba si son exactamente la misma tabla en la memoria. Dos objetos separados con datos idénticos devolverán false:

local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2)  -- Salida: false (tablas diferentes)

Con __eq, puedes definir tu propia lógica de igualdad. En una clase, lo añades igual que __tostring, como una función en la tabla de la clase. Para que la igualdad funcione, ambos objetos deben compartir la misma metatabla:

local User = {}
User.__index = User

function User:new(id, name)
    local instance = {}
    setmetatable(instance, self)
    instance.id = id
    instance.name = name
    return instance
end

function User:__eq(other)
    return self.id == other.id
end

Ahora dos objetos User se consideran iguales si comparten el mismo ID, independientemente de los demás campos:

local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")

print(u1 == u2)  -- Salida: true (mismo ID)
print(u1 == u3)  -- Salida: false (IDs diferentes)

Este patrón es valioso cuando los objetos representan entidades del mundo real con identificadores únicos: comparar registros de bases de datos, entidades de juegos o cualquier objeto en el que la identidad importe más que la ubicación en memoria.

challenge icon

Desafío

Fácil

¡Construyamos una clase Product que pueda determinar si dos productos son el mismo artículo, incluso cuando están almacenados en tablas completamente diferentes! En los sistemas de venta minorista, los productos suelen tener códigos SKU únicos (unidades de mantenimiento de existencias), y dos productos deben considerarse iguales si comparten el mismo SKU, independientemente de otros detalles, como los cambios de precio.

Organizarás tu código en dos archivos:

  • Product.lua: Define tu clase Product con el patrón de prototipo estándar. Cada producto debe almacenar un sku (el identificador único) y un name. Implementa el metamétodo __eq para que dos productos se consideren iguales cuando tengan el mismo SKU: el nombre no importa para la igualdad.
  • main.lua: Requiere tu módulo Product y crea varias instancias de productos. Compáralas usando el operador == para ver tu lógica de igualdad personalizada en acción.

Tu clase Product debe incluir:

  • Un constructor :new(sku, name)
  • Un método :getInfo() que devuelva una cadena con el formato: [sku]: [name]
  • El metamétodo __eq que compare los productos por su SKU

Recibirás seis entradas:

  1. SKU del primer producto
  2. Nombre del primer producto
  3. SKU del segundo producto
  4. Nombre del segundo producto
  5. SKU del tercer producto
  6. Nombre del tercer producto

En tu archivo principal, crea tres productos usando las entradas proporcionadas y después imprime:

  1. La información de cada producto (tres líneas)
  2. El resultado de comparar el producto 1 con el producto 2
  3. El resultado de comparar el producto 1 con el producto 3

Por ejemplo, si las entradas son ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789 y Keyboard, la salida debería ser:

ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
false

Observa cómo los dos primeros productos son iguales (tienen el mismo SKU), aunque sus nombres difieren. ¡Así es exactamente como los sistemas de inventario reales hacen un seguimiento de los productos a través de cambios de nombre y actualizaciones!

Pruébalo tú mismo

-- Requiere el módulo Product
local Product = require('Product')

-- Lee las entradas
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()

-- TODO: Crea tres instancias de Product usando las entradas

-- TODO: Imprime la info de cada producto (tres líneas)

-- TODO: Imprime el resultado de comparar el producto 1 con el producto 2

-- TODO: Imprime el resultado de comparar el producto 1 con el producto 3
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 Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online