Michael# Posted May 12, 2012 Share Posted May 12, 2012 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 Link to comment
Stanley Sathler Posted May 13, 2012 Share Posted May 13, 2012 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. Link to comment
Michael# Posted May 13, 2012 Author Share Posted May 13, 2012 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? Link to comment
Stanley Sathler Posted May 14, 2012 Share Posted May 14, 2012 Ahh sim Michael, entendi perfeitamente a questão dos underline's também. Pô cara, brigadão, sempre quis saber isso, haha. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now