Menu
Coddy logo textTech

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
end

Con __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: false

Aquí 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.

challenge icon

Desafío

Fácil

Vamos 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 campos name y price. Incluye un constructor :new(name, price) e implementa el metamétodo __lt para comparar productos por su precio. Recuerda que definir __lt automáticamente te otorga el operador tambié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:

  1. Nombre del primer producto
  2. Precio del primer producto
  3. Nombre del segundo producto
  4. 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:

  1. ¿Es el primer producto menor que el segundo? (imprime true o false)
  2. ¿Es el primer producto mayor que el segundo? (imprime true o false)
  3. 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
Apple

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

Con __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: false

Lua 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
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