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
endObserve 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 PhDComo 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.
Desafio
FácilVamos 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 campotextque 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:
- O texto do título (por exemplo, "Engineer")
- Uma string de prefixo para colocar antes do título (por exemplo, "Senior ")
- 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:
- Concatene a string de prefixo com o objeto título
- 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 IIIA 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
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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse RetânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de FormasPratique por conta própria: Compilador de Lua online