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
endCon __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: falseEcco 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.
Sfida
FacileCreiamo 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 campinameeprice. Includi un costruttore:new(name, price)e implementa il metametodo__ltper confrontare i prodotti in base al loro prezzo. Ricorda che definire__ltti 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:
- Nome del primo prodotto
- Prezzo del primo prodotto
- Nome del secondo prodotto
- 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:
- Il primo prodotto è minore del secondo? (stampa
trueofalse) - Il primo prodotto è maggiore del secondo? (stampa
trueofalse) - Stampa il nome del prodotto più economico
Per esempio, se gli input sono Apple, 2, Laptop e 999, l'output dovrebbe essere:
true
false
AppleApple (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
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
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online