Menu
Coddy logo textTech

Verificações de Igualdade

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 17 de 70.

Você viu como __tostring controla como um objeto se exibe. Outro metamétodo útil é __eq, que define quando dois objetos devem ser considerados iguais usando o operador ==.

Por padrão, comparar duas tabelas com == verifica se elas são exatamente a mesma tabela na memória. Dois objetos separados com dados idênticos retornarão false:

local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2)  -- Saída: false (tabelas diferentes)

Com __eq, você pode definir sua própria lógica de igualdade. Em uma classe, você o adiciona assim como __tostring, como uma função na tabela da classe. Para que a igualdade funcione, ambos os objetos devem compartilhar a mesma metatabela:

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

Agora, dois objetos User são considerados iguais se compartilharem o mesmo ID, independentemente dos outros campos:

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

print(u1 == u2)  -- Saída: true (mesmo ID)
print(u1 == u3)  -- Saída: false (IDs diferentes)

Este pattern é valioso quando os objetos representam entidades do mundo real com identificadores exclusivos: comparando registros de banco de dados, entidades de jogos ou quaisquer objetos em que a identidade seja mais importante do que a localização na memória.

challenge icon

Desafio

Fácil

Vamos criar uma classe Product capaz de determinar se dois produtos são o mesmo item, mesmo quando estão armazenados em tabelas completamente diferentes! Em sistemas de varejo, os produtos geralmente têm códigos SKU exclusivos (Stock Keeping Units), e dois produtos devem ser considerados iguais se compartilharem o mesmo SKU, independentemente de outros detalhes, como alterações de preço.

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

  • Product.lua: defina sua classe Product com o padrão de protótipo. Cada produto deve armazenar um sku (o identificador exclusivo) e um name. Implemente o metamétodo __eq para que dois produtos sejam considerados iguais quando tiverem o mesmo SKU: o nome não importa para a igualdade.
  • main.lua: exija seu módulo Product e crie várias instâncias de produtos. Compare-as usando o operador == para ver sua lógica de igualdade personalizada em ação.

Sua classe Product deve incluir:

  • Um construtor :new(sku, name)
  • Um método :getInfo() que retorne uma string no formato: [sku]: [name]
  • O metamétodo __eq que compara produtos pelos seus SKUs

Você receberá seis entradas:

  1. SKU do primeiro produto
  2. Nome do primeiro produto
  3. SKU do segundo produto
  4. Nome do segundo produto
  5. SKU do terceiro produto
  6. Nome do terceiro produto

Em seu arquivo principal, crie três produtos usando as entradas fornecidas e, em seguida, imprima:

  1. As informações de cada produto (três linhas)
  2. O resultado da comparação do produto 1 com o produto 2
  3. O resultado da comparação do produto 1 com o produto 3

Por exemplo, se as entradas forem ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789 e Keyboard, a saída deverá ser:

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

Observe como os dois primeiros produtos são iguais (mesmo SKU), embora seus nomes sejam diferentes. É exatamente assim que os sistemas reais de inventário acompanham os produtos durante alterações de nome e atualizações!

Experimente você mesmo

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

-- Lê as 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: Crie três instâncias de Product usando as entradas

-- TODO: Imprima as informações de cada produto (três linhas)

-- TODO: Imprima o resultado da comparação do produto 1 com o produto 2

-- TODO: Imprima o resultado da comparação do produto 1 com o produto 3
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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online