Skip to content

Latest commit

 

History

History
113 lines (79 loc) · 4.23 KB

metatables.md

File metadata and controls

113 lines (79 loc) · 4.23 KB

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.

Lista de meta métodos

Documentação completa

Í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

Meta métodos aritméticos: __add, __sub, __mul, __div e __mod.

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.

Meta método unário: __unm.

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

Meta método concatenação: __concat.

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: