Jump to content

Usando metatabelas e metamétodos


Recommended Posts

Posted

Bom dia.

Para começar vou mostrar como usar metatabelas e metamétodos que são partes de um sistema de classes.

//

Uma metatabela é uma tabela que faz com que nós possamos mudar o comportamento de uma tabela.

A metatabela é usada em classes mas como LUA é orientado a funções e não a objetos, então isso só vai ficar "parecendo" classes.

Para criar uma tabela usamos setmetatable.

Para saber:

self é a classe da função.

//

Metamétodos são as funções dentro dos métodos.

Para criar um metamétodo você deve fazer o seguinte:

function Classe:NomeDoMétodo ( parametros ) 
end 

Para você poder executar métodos e passar parametros para / entre eles você tem que definir uma metatabela, exemplo:

-- dentro da funçao 
setmetatable ( { parametro = parametro1; parametr = parametro2 }, Classe ); 
  
-- global, sem precisar botar dentro da funçao 
  
setmetatable ( { __index = Classe }, Classe ); 

//

Exemplo de script:

Contatos = { } -- declara uma tabela 
  
-- declara um metamétodo 
  
function Contatos:AddClientValue ( tValues ) 
    -- bota todos os parametros do nosso método em uma tabela e a define como metatabela de self 
    setmetatable ( { unpack ( tValues ) }, self ); 
     
    -- adiciona todos os valores em self 
    table.insert ( self, tValues ); 
     
    -- executa o método SendToClient 
    self:SendToClient ( 'Data sent sucessfully!' ); 
end 
  
function Contatos:SendToClient ( sMessage ) 
    -- bota todos os parametros do nosso metodo em uma tabela e a define como metatabela de self 
    setmetatable ( { message = sMessage }, self ); 
     
    -- envia a mensagem 
    _G['print'] ( tostring ( sMessage ) ); -- _G é uma variavel contendo todas as funções de LUA 
    -- declara um loop for e envia todos os dados da tabela self 
    for selfIndex, selfValue in pairs ( self ) do 
        for index, value in pairs ( selfValue ) do 
            _G['print'] ( index .. ' => ' .. value ); 
        end 
    end 
end 

--

Exemplo de uso:

Contatos:AddClientValue 
{ 
    ['Name']        = "Michael", 
    ['Age']         = "20", 
    ['Job']         = "Hosting Company Owner - Damaged Games"; 
} 
  
-- Output: 
  
Name => Michael 
Age => 20 
Job => Hosting Company Owner - Damaged Games 

Espero que tenham entendido ;)

Posted

Opa, muito bom, Michael! Admito que tive de reler uma ou duas vezes para entender, mas consegui. O que me falta agora é prática para tal, mas assim que possível estarei fazendo isso.

A propósito, bem que você poderia escrever um pequeno texto explicando o uso de "_" em algumas funções, hein? Por exemplo, já vi você usando:

for _, v in pairs(table) do 
-- Conteudo 
end 

Qual o objetivo do "_" (underline) acima? Você poderia escrever um texto explicando o uso deste também? Acho que muitos têm essa mesma dúvida, hehe.

Um forte abraço,

Stanley Sathler.

Software Engineer & Entrepreneur Running Lustrel and VilarikA • Highly engaged on open source community

Posted

Isso é apenas para lembrar que é uma variável sem uso, tipo, quando eu preciso de um parametro especifico de uma função e só esse mas esse é, por exemplo, o quarto parametro, eu boto:

_, _, _, meuParam 

.

Igual nesse loop, como eu não vou necessitar dos índices da tabela eu boto _.

Espero que tenha entendido

//

Sobre as Classes, tem muita gente que podem não estar entendendo isso então leia e releia como o Stanley fez.

Os iniciantes podem achar que isso não ajuda em nada, mas sim, ajuda muito, uma das coisas em que ajuda é na organização do código e também fica muito mais fácil de encontrar as funções.

Você em vez de:

function drawTextBehindWindow ( nX, nY, nZ, uAssignTo ) 

Pode simplesmente fazer:

function theWindow:drawText ( nX, nY, nZ, uAssignTo ) 

Mas não se esqueça aqui no último exemplo theWindow:drawText que self ( classe ) tem que ser um objecto da classe, ou seja, theWindow tem que ser uma janela criada com uma função de classe. Entende?

Posted

Ahh sim Michael, entendi perfeitamente a questão dos underline's também. Pô cara, brigadão, sempre quis saber isso, haha.

Software Engineer & Entrepreneur Running Lustrel and VilarikA • Highly engaged on open source community

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...