Menu
Coddy logo textTech

Comparar objetos (<, >)

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

Además de la aritmética y la concatenación, también puedes definir cómo se comparan entre sí los objetos usando metamétodos de comparación. El metamétodo __lt gestiona el operador «menor que» (<code><).

Cuando Lua evalúa a < b, busca __lt en la metatabla. Este metamétodo debe devolver true o false según 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 proporciona ambas direcciones de comparación de forma gratuita.

challenge icon

Desafío

Fácil

Construyamos una clase Product que se pueda comparar usando los operadores <code>< y según el precio. Esto es perfecto para situaciones 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 según su precio. Recuerda que definir __lt te proporciona automáticamente también el operador : ¡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 proporcionados. Después realiza tres comparaciones e imprime el resultado de cada una en una línea separada:

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

Apple (precio 2) es menor que Laptop (precio 999), por lo que la primera comparación es true. Apple no es mayor que Laptop, así que la segunda es false. Y como Apple tiene el precio más bajo, se imprime como el producto más barato.

Pruébalo tú mismo

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

-- Lee las entradas
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Crea dos instancias de Product usando Product:new()

-- TODO: Compara los productos usando el operador < e imprime true/false

-- TODO: Compara los productos usando el operador > e imprime true/false

-- TODO: Imprime 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 Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online