Menu
Coddy logo textTech

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

Come 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.

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, 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 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 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:

  1. Il testo del titolo (ad esempio, "Engineer")
  2. Una stringa di prefisso da inserire prima del titolo (ad esempio, "Senior ")
  3. 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:

  1. Concatena la stringa di prefisso con l'oggetto titolo
  2. 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 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 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
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