Menu
Coddy logo textTech

Concatenando Objetos

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 28 de 70.

O operador .. em Lua concatena strings, mas e se você quiser combinar um objeto com uma string? O metamétodo __concat permite definir exatamente como isso deve funcionar.

Quando o Lua encontra a .. b e um dos operandos tem um metamétodo __concat, ele chama essa função com ambos os valores. Isso é útil quando você quer que os objetos se integrem naturalmente a expressões de string.

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

Observe que a função verifica qual operando é a string. Como .. pode ser usado como "Hello " .. obj ou obj .. "!", seu metamétodo deve lidar com ambos os casos.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Saída: Dr. Ada Lovelace
print(person .. " PhD")      -- Saída: Ada Lovelace PhD

Assim como outros metamétodos de operadores, __concat usa a sintaxe de ponto e recebe ambos os operandos como argumentos. A principal diferença em relação aos metamétodos aritméticos é que, normalmente, você trabalha com tipos mistos. Seu objeto e uma string.

challenge icon

Desafio

Fácil

Vamos criar uma classe Title que possa ser combinada naturalmente em expressões de string usando o operador ... Isso é útil quando você quer combinar objetos com strings de uma maneira legível e intuitiva, como adicionar formas de tratamento ou sufixos ao título de uma pessoa.

Você organizará seu código em dois arquivos:

  • Title.lua: Defina sua classe Title com um campo text que armazena a string do título. Inclua um construtor :new(text) e implemente o metamétodo __concat. Seu metamétodo deve lidar com os dois casos: quando uma string vem antes do objeto ("prefix" .. obj) e quando uma string vem depois (obj .. "suffix"). O resultado deve combinar a string com o texto do título adequadamente.
  • main.lua: Importe seu módulo Title, crie uma instância de título e demonstre a concatenação em ambas as direções.

Você receberá três entradas:

  1. O texto do título (por exemplo, "Engineer")
  2. Uma string de prefixo para colocar antes do título (por exemplo, "Senior ")
  3. Uma string de sufixo para colocar depois do título (por exemplo, " III")

No arquivo principal, crie um Title com o texto fornecido. Em seguida, faça duas concatenações e imprima cada resultado em uma linha separada:

  1. Concatene a string de prefixo com o objeto de título
  2. Concatene o objeto de título com a string de sufixo

Por exemplo, se as entradas forem Engineer, Senior e III, a saída deverá ser:

Senior Engineer
Engineer III

A primeira linha mostra o prefixo combinado com o título, e a segunda linha mostra o título combinado com o sufixo. Seu metamétodo __concat torna possível essa combinação natural de strings!

Experimente você mesmo

-- Ler as entradas
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

-- Requerer o módulo Title
local Title = require('Title')

-- TODO: Criar uma instância de Title com o titleText fornecido

-- TODO: Concatenar prefix com o objeto title e imprimir o resultado

-- TODO: Concatenar o objeto title com suffix e imprimir o resultado
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online