Menu
Coddy logo textTech

Confrontare oggetti (<, >)

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 29 di 70.

Oltre all'aritmetica e alla concatenazione, puoi anche definire come gli oggetti vengono confrontati tra loro usando i metametodi di confronto. Il metametodo __lt gestisce l'operatore «minore di» (<).

Quando Lua valuta a < b, cerca __lt nella metatabella. Questo metametodo dovrebbe restituire true o false in base alla tua logica di confronto.

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 definito, ora puoi confrontare direttamente gli elementi:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop)   -- Output: true
print(laptop < apple)   -- Output: false

Ecco la parte ingegnosa: Lua ricava automaticamente l’operatore > da __lt. Quando scrivi a > b, Lua valuta semplicemente b < a al suo posto. Quindi, definendo solo __lt, ottieni gratuitamente entrambe le direzioni di confronto.

challenge icon

Sfida

Facile

Creiamo una classe Product che possa essere confrontata usando gli operatori < e > in base al prezzo. È perfetta per situazioni come ordinare gli articoli in un carrello della spesa o trovare l'opzione più economica in un elenco.

Organizzerai il codice in due file:

  • Product.lua: definisci la classe Product con i campi name e price. Includi un costruttore :new(name, price) e implementa il metametodo __lt per confrontare i prodotti in base al loro prezzo. Ricorda che definire __lt ti fornisce automaticamente anche l'operatore >: Lua se ne occupa per te!
  • main.lua: importa il modulo Product, crea istanze dei prodotti a partire dagli input e confrontale per determinare quale costa di più o di meno.

Riceverai quattro input:

  1. Nome del primo prodotto
  2. Prezzo del primo prodotto
  3. Nome del secondo prodotto
  4. Prezzo del secondo prodotto

Nel file principale, crea due prodotti con i nomi e i prezzi indicati. Poi esegui tre confronti e stampa il risultato di ciascuno su una riga separata:

  1. Il primo prodotto è minore del secondo? (stampa true o false)
  2. Il primo prodotto è maggiore del secondo? (stampa true o false)
  3. Stampa il nome del prodotto più economico

Per esempio, se gli input sono Apple, 2, Laptop e 999, l'output dovrebbe essere:

true
false
Apple

Apple (prezzo 2) è minore di Laptop (prezzo 999), quindi il primo confronto è true. Apple non è maggiore di Laptop, quindi il secondo risultato è false. E poiché Apple ha il prezzo più basso, viene stampata come il prodotto più economico.

Provalo tu

-- Carica il modulo Product con require
local Product = require('Product')

-- Leggi gli input
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Crea due istanze di Product usando Product:new()

-- TODO: Confronta i prodotti usando l'operatore < e stampa true/false

-- TODO: Confronta i prodotti usando l'operatore > e stampa true/false

-- TODO: Stampa il nome del prodotto meno costoso
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online