Comparar objetos (<, >)
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 29 de 70.
Más allá de la aritmética y la concatenación, también puedes definir cómo se comparan los objetos entre sí utilizando metamétodos de comparación. El metamétodo __lt maneja el operador "menor que" (<code><).
Cuando Lua evalúa a < b, busca __lt en la metatabla. Este metamétodo debe devolver true o false basado en tu lógica de comparación.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
endCon __lt definido, ahora puedes comparar elementos directamente:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Salida: true
print(laptop < apple) -- Salida: falseAquí está la parte ingeniosa: Lua deriva automáticamente el operador de __lt. Cuando escribes a > b, Lua simplemente evalúa b < a en su lugar. Así que definir solo __lt te da ambas direcciones de comparación de forma gratuita.
Desafío
FácilVamos a construir una clase Product que pueda compararse utilizando los operadores <code>< y basándose en el precio. Esto es perfecto para escenarios como ordenar artículos en un carrito de compras o encontrar la opción más barata en una lista.
Organizarás tu código en dos archivos:
Product.lua: Define tu clase Product con los camposnameyprice. Incluye un constructor:new(name, price)e implementa el metamétodo__ltpara comparar productos por su precio. Recuerda que definir__ltautomáticamente te otorga el operadortambién—¡Lua se encarga de eso por ti!main.lua: Requiere tu módulo Product, crea instancias de productos a partir de las entradas y compáralas para determinar cuál cuesta más o menos.
Recibirás cuatro entradas:
- Nombre del primer producto
- Precio del primer producto
- Nombre del segundo producto
- Precio del segundo producto
En tu archivo principal, crea dos productos con los nombres y precios dados. Luego realiza tres comparaciones e imprime el resultado de cada una en una línea separada:
- ¿Es el primer producto menor que el segundo? (imprime
trueofalse) - ¿Es el primer producto mayor que el segundo? (imprime
trueofalse) - Imprime el nombre del producto más barato
Por ejemplo, si las entradas son Apple, 2, Laptop, y 999, la salida debería ser:
true
false
AppleEl Apple (precio 2) es menor que el Laptop (precio 999), por lo que la primera comparación es true. El Apple no es mayor que el Laptop, por lo que la segunda es false. Y dado que Apple tiene el precio más bajo, se imprime como el producto más barato.
Hoja de referencia
El metamétodo __lt maneja el operador "menor que" (<code><) para objetos personalizados.
Cuando Lua evalúa a < b, busca __lt en la metatabla. Este metamétodo debe devolver true o false basándose en tu lógica de comparación.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
endCon __lt definido, puedes comparar elementos directamente:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Salida: true
print(laptop < apple) -- Salida: falseLua deriva automáticamente el operador a partir de __lt. Cuando escribes a > b, Lua evalúa b < a en su lugar. Definir solo __lt te proporciona ambas direcciones de comparación.
Pruébalo tú mismo
-- Requerir el módulo Product
local Product = require('Product')
-- Leer entradas
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- TODO: Crear dos instancias de Product usando Product:new()
-- TODO: Comparar productos usando el operador < e imprimir true/false
-- TODO: Comparar productos usando el operador > e imprimir true/false
-- TODO: Imprimir el nombre del producto más barato
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