Começando a entrar mais nas individualidades de Lua chegamos no assunto de Metatables, poderiamos chamar de "meta tabelas" mas por questões estéticas prefiro manter "metatables". Esse conceito é um dos mais poderosos dentro de lua, flexibilizando bastante a sintaxe da linguagem.
Metatables são tabelas que ajudam a controlar o comportamento de outras tabelas. Conseguimos desde alterar o comportamento de certos operadores até adicionar valores padrões para indices novos e muito mais.
Índice | Comportamento |
---|---|
__add | Executa sempre que o operador de soma "+" é chamado |
__sub | Executa sempre que o operador de subtração "-" é chamado |
__mul | Executa sempre que o operador de multiplicação "*" é chamado |
__div | Executa sempre que o operador de divisão "/" é chamado |
__mod | Executa sempre que o operador de módulo "%" é chamado |
__pow | Executa sempre que o operador de módulo "^" é chamado |
__unm | Executa sempre que o operador unário "-" é chamado |
__concat | Executa sempre que o operador de concatenação ".." é chamado |
__len | Executa sempre que o operador de length "#" é chamado |
__eq | Executa sempre que o operador de comparação "==" é chamado |
__it | Executa sempre que o operador de comparação "<" é chamado |
__le | Executa sempre que o operador de comparação "<=" é chamado |
__call | Executa sempre que a tabela é chamada como função "table()" |
__tostring | Executa sempre que é chamado a função tostring() é chamada |
__newindex | Executa sempre que um novo indice é acessado |
_index | Executa sempre que um indice declarado é acessado |
Sempre que definimos esses métodos, eles são chamados quando executamos seus respectivos operadores. Por exemplo
local obj = { value = 2 }
setmetatable(obj, {
__add = function(a, b)
return a.value + b
end
})
print(obj + 3)
Nesse código criamos uma tabela e definimos o comportamento que deve ter quando for somada a outro valor, e nesse caso somamos o valor com a propriedade "value" dessa tabela e retornamos o resultado da soma.
5
Esse comportamento pode ser replicado para qualquer operador aritmético da lista.
Quando tornamos um valor negativo pondo um "-" antes desse valor, esse meta método é chamado para retornar algo do mesmo jeito que números retornam seu próprio valor com sinal invertido.
local obj = { value = 2 }
setmetatable(obj, {
__unm = function(a, b)
return a.value * -2
end
})
print(-obj)
Nesse código criamos uma tabela com um comportamento para que quando executamos o operador unário "-", seja retornado seu valor multiplicado por -2.
-4
Quando usamos o operador ".." geralmente estamos tentando unir duas strings em uma só. Mas sempre que isso é feito com uma tabela, esse meta método é chamado para controlar o comportamento que essa tabela deve ter.
local obj = { value = "Lorem" }
setmetatable(obj, {
__concat = function(a, b)
return string.reverse(a.value .. " " .. b)
end
})
print(obj .. "Ipsum")
Nesse código criamos uma tabela com um comportamento para que quando executamos o operador de concatenação "..", seja retornado seu valor concatenado e invertido.
muspI meroL
Próximo: