Menu
CoddyTech

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. È utile quando vuoi che gli oggetti si integrino naturalmente nelle espressioni stringa.

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
end

Nota 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)      -- Risultato: Dr. Ada Lovelace
print(person .. " PhD")      -- Risultato: Ada Lovelace PhD

Come gli altri metametodi degli operatori, __concat si scrive con un punto per convenzione e riceve entrambi gli operandi come argomenti. La differenza principale rispetto ai metametodi aritmetici è che di solito si lavora con tipi diversi: il tuo oggetto e una stringa.

challenge icon

Sfida

Facile

Creiamo 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, ad 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 campo text che 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 segue l'oggetto (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:

  1. Il testo del titolo (ad esempio, "Engineer")
  2. Una stringa prefisso da posizionare prima del titolo (ad esempio, "Senior ")
  3. Una stringa suffisso da posizionare dopo il titolo (ad esempio, " III")

Nel file principale, crea un Title con il testo fornito. Quindi esegui due concatenazioni e stampa ciascun risultato su una riga separata:

  1. Concatena la stringa prefisso con l'oggetto titolo
  2. Concatena l'oggetto titolo con la stringa suffisso

Ad esempio, se gli input sono Engineer, Senior e III, l'output dovrebbe essere:

Senior Engineer
Engineer III

La 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
local Title = require('Title')

-- TODO: Crea un'istanza di Title con il valore titleText fornito

-- TODO: Concatena prefix con l'oggetto title e stampa il risultato

-- TODO: Concatena l'oggetto title con suffix e stampa il risultato
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