Michael#

Usando metatabelas e metamétodos

Recommended Posts

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 ;)

Share this post


Link to post

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.

Share this post


Link to post

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?

Share this post


Link to post

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

Share this post


Link to post

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.