Concatenare oggetti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 28 di 70.
L'operatore .. in Lua concatena le stringhe, ma cosa succede se vuoi combinare un oggetto con una stringa? Il metametodo __concat ti permette di definire esattamente come deve funzionare.
Quando Lua incontra a .. b e uno degli operandi ha un metametodo __concat, chiama quella funzione con entrambi i valori. Questo è utile quando vuoi che gli oggetti si integrino naturalmente nelle espressioni di stringhe.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endNota che la funzione controlla quale operando è la stringa. Poiché .. può essere usato come "Hello " .. obj o obj .. "!", il tuo metametodo dovrebbe gestire entrambi i casi.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- Output: Dr. Ada Lovelace
print(person .. " PhD") -- Output: Ada Lovelace PhDCome altri metametodi degli operatori, __concat usa la sintassi con il punto e riceve entrambi gli operandi come argomenti. La differenza principale rispetto ai metametodi aritmetici è che in genere lavori con tipi misti: il tuo oggetto e una stringa.
Sfida
FacileCreiamo una classe Title che possa integrarsi naturalmente nelle espressioni con stringhe usando l'operatore ... È utile quando vuoi combinare oggetti e stringhe in modo leggibile e intuitivo, per esempio aggiungendo titoli onorifici o suffissi al titolo di una persona.
Organizzerai il codice in due file:
Title.lua: definisci la classe Title con un campotextche memorizza la stringa del titolo. Includi un costruttore:new(text)e implementa il metametodo__concat. Il metametodo deve gestire entrambi i casi: quando una stringa precede l'oggetto ("prefix" .. obj) e quando una stringa lo segue (obj .. "suffix"). Il risultato deve combinare opportunamente la stringa con il testo del titolo.main.lua: richiedi il modulo Title, crea un'istanza del titolo e mostra la concatenazione in entrambe le direzioni.
Riceverai tre input:
- Il testo del titolo (ad esempio, "Engineer")
- Una stringa di prefisso da inserire prima del titolo (ad esempio, "Senior ")
- Una stringa di suffisso da inserire dopo il titolo (ad esempio, " III")
Nel file principale, crea un Title con il testo fornito. Poi esegui due concatenazioni e stampa ciascun risultato su una riga separata:
- Concatena la stringa di prefisso con l'oggetto titolo
- Concatena l'oggetto titolo con la stringa di suffisso
Ad esempio, se gli input sono Engineer, Senior e III, l'output dovrebbe essere:
Senior Engineer
Engineer IIILa prima riga mostra il prefisso combinato con il titolo e la seconda riga mostra il titolo combinato con il suffisso. Il metametodo __concat rende possibile questa naturale combinazione di stringhe!
Provalo tu
-- Leggi gli input
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Carica il modulo Title con require
local Title = require('Title')
-- TODO: Crea un'istanza di Title con il titleText fornito
-- TODO: Concatena prefix con l'oggetto title e stampa il risultato
-- TODO: Concatena l'oggetto title con suffix e stampa il risultato
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