Menu
CoddyTech

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 Lua encontra a .. b e um dos operandos tem um metamétodo __concat, ela chama essa função com os dois 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 .. "!", sua metamétodo deve lidar com os dois casos.

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

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

Como outros metamétodos de operadores, __concat é escrito com um ponto por convenção e recebe os dois operandos como argumentos. A principal diferença em relação aos metamétodos aritméticos é que normalmente você trabalha com tipos diferentes: seu objeto e uma string.

challenge icon

Desafio

Fácil

Vamos criar uma classe Title que possa se integrar naturalmente a expressões com strings usando o operador ... Isso é útil quando você quer combinar objetos com strings de uma forma legível e intuitiva, como adicionar títulos honoríficos 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 o texto 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 de forma apropriada.
  • main.lua: Importe seu módulo Title, crie uma instância de título e demonstre a concatenação nas duas 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 seu 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 título
  2. Concatene o objeto 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 possibilita essa combinação natural de strings!

Experimente você mesmo

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

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

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

-- TODO: Concatene prefix com o objeto title e imprima o resultado

-- TODO: Concatene o objeto title com suffix e imprima 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