Menu
Coddy logo textTech

Comparando Objetos (<, >)

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 29 de 70.

Além de aritmética e concatenação, você também pode definir como os objetos se comparam entre si usando metamétodos de comparação. O metamétodo __lt manipula o operador "menor que" (<code><).

Quando o Lua avalia a < b, ele procura por __lt na metatabela. Este metamétodo deve retornar true ou false com base na sua lógica de comparação.

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

Com __lt definido, você agora pode comparar itens diretamente:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)

print(apple < laptop)   -- Saída: true
print(laptop < apple)   -- Saída: false

Aqui está a parte inteligente: Lua deriva automaticamente o operador de __lt. Quando você escreve a > b, Lua simplesmente avalia b < a em vez disso. Portanto, definir apenas __lt oferece ambas as direções de comparação gratuitamente.

challenge icon

Desafio

Fácil

Vamos construir uma classe Product que possa ser comparada usando os operadores <code>< e com base no preço. Isso é perfeito para cenários como ordenar itens em um carrinho de compras ou encontrar a opção mais barata em uma lista.

Você organizará seu código em dois arquivos:

  • Product.lua: Defina sua classe Product com os campos name e price. Inclua um construtor :new(name, price) e implemente o metamétodo __lt para comparar produtos pelo seu preço. Lembre-se de que definir __lt automaticamente fornece o operador também — o Lua cuida disso para você!
  • main.lua: Importe seu módulo Product, crie instâncias de produtos a partir das entradas e compare-as para determinar qual custa mais ou menos.

Você receberá quatro entradas:

  1. Nome do primeiro produto
  2. Preço do primeiro produto
  3. Nome do segundo produto
  4. Preço do segundo produto

No seu arquivo principal, crie dois produtos com os nomes e preços fornecidos. Em seguida, realize três comparações e imprima o resultado de cada uma em uma linha separada:

  1. O primeiro produto é menor que o segundo? (imprima true ou false)
  2. O primeiro produto é maior que o segundo? (imprima true ou false)
  3. Imprima o nome do produto mais barato

Por exemplo, se as entradas forem Apple, 2, Laptop e 999, a saída deve ser:

true
false
Apple

A Apple (preço 2) é menor que o Laptop (preço 999), então a primeira comparação é true. A Apple não é maior que o Laptop, então a segunda é false. E como a Apple tem o preço mais baixo, ela é impressa como o produto mais barato.

Folha de consulta

O metamétodo __lt lida com o operador "menor que" (<code><) para objetos personalizados.

Quando o Lua avalia a < b, ele procura por __lt na metatabela. Este metamétodo deve retornar true ou false com base na sua lógica de comparação.

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

Com o __lt definido, você pode comparar itens diretamente:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)

print(apple < laptop)   -- Saída: true
print(laptop < apple)   -- Saída: false

O Lua deriva automaticamente o operador a partir de __lt. Quando você escreve a > b, o Lua avalia b < a em vez disso. Definir apenas __lt fornece ambas as direções de comparação.

Experimente você mesmo

-- Requer o módulo Product
local Product = require('Product')

-- Lê as entradas
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Cria duas instâncias de Product usando Product:new()

-- TODO: Compara os produtos usando o operador < e imprime true/false

-- TODO: Compara os produtos usando o operador > e imprime true/false

-- TODO: Imprime o nome do produto mais barato
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming