[Tutorial] Usando metatabelas e metamétodos [MTA]

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:

  1. function Classe:NomeDoMétodo ( parametros )
  2. end

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

  1. -- dentro da funçao
  2. setmetatable ( { parametro = parametro1; parametr = parametro2 }, Classe );
  3.  
  4. -- global, sem precisar botar dentro da funçao
  5.  
  6. setmetatable ( { __index = Classe }, Classe );

//
Exemplo de script:

  1. Contatos = { } -- declara uma tabela
  2.  
  3. -- declara um metamétodo
  4.  
  5. function Contatos:AddClientValue ( tValues )
  6.     -- bota todos os parametros do nosso método em uma tabela e a define como metatabela de self
  7.     setmetatable ( { unpack ( tValues ) }, self );
  8.    
  9.     -- adiciona todos os valores em self
  10.     table.insert ( self, tValues );
  11.    
  12.     -- executa o método SendToClient
  13.     self:SendToClient ( 'Data sent sucessfully!' );
  14. end
  15.  
  16. function Contatos:SendToClient ( sMessage )
  17.     -- bota todos os parametros do nosso metodo em uma tabela e a define como metatabela de self
  18.     setmetatable ( { message = sMessage }, self );
  19.    
  20.     -- envia a mensagem
  21.     _G['print'] ( tostring ( sMessage ) )-- _G é uma variavel contendo todas as funções de LUA
  22.     -- declara um loop for e envia todos os dados da tabela self
  23.     for selfIndex, selfValue in pairs ( self ) do
  24.         for index, value in pairs ( selfValue ) do
  25.             _G['print'] ( index .. ' => ' .. value );
  26.         end
  27.     end
  28. end

--
Exemplo de uso:


  1. Contatos:AddClientValue
  2. {
  3.     ['Name']        = "Michael",
  4.     ['Age']         = "20",
  5.     ['Job']         = "Hosting Company Owner - Damaged Games";
  6. }
  7.  
  8. -- Output:
  9.  
  10. Name => Michael
  11. Age => 20
  12. Job => Hosting Company Owner - Damaged Games

Espero que tenham entendido ;)


Creditos: Michael#

0 comentários:

Postar um comentário

 
▲ Subir