exemplo de metatabela/metametodo

82 views
Skip to first unread message

Denis Dos Santos Silva

unread,
Jul 28, 2021, 2:58:00 PM7/28/21
to Lua BR
exemplo inspirado no toString() da linguagem Java.
--
-- teste.lua
--

local tbl;

tbl = setmetatable({chave1 = "123", chave2 = "valor"}, {
   __tostring = function( self )
     local x = nil;

     for k, v in pairs(self) do
     x = string.format("%s %s:%s", true and x or "", k, v);
     end

     return string.format('TABELA:%q', x:match( "^%s*(.-)%s*$" ));
   end
});

print('tbl     ', tbl);
print('type    ', type(tbl));
print('chave1  ', tbl.chave1);
print('chave2  ', tbl.chave2);
print('nonexist', tbl.nonexist);
--- eof --

$ lua-5.1 table.lua
tbl             TABELA:"chave2:valor chave1:123"
type            table
chave1          123
chave2          valor
nonexist        nil



jdsmed...@gmail.com

unread,
Sep 10, 2021, 7:03:39 AM9/10/21
to Lua BR
A grosso modo, seria um forma de criar em uma tabela já existente, uma função que altera os dados conforme desejar, passando parâmetros e comportamentos pre-definidos dentro da própria tabela?

Denis Dos Santos Silva

unread,
Sep 11, 2021, 12:06:34 PM9/11/21
to Lua BR
Via de regra quando usamos a função print() e informamos uma tabela como argumento o retorno é algo parecido com o exemplo abaixo.

lua-5.1.exe - <<EOT
tbl={1,2,3}; print(tbl);
EOT

retorno: table: 0x600008540

lua52.exe - <<EOT
tbl={1,2,3}; print(tbl)
EOT

retorno: table: 0x600006bc0

Porém isso não é muito "informativo", dai, uma saída  simples (e poderosa) é usar metatables and metamethods, em poucas palavras, implementa alguns comportamentos de uma tabela lua - só lembrando que a função print (nativa) verifica se o argumento passado tem o metamethods implementado (__tostring) p.ex. casos como userdata ou tabelas.

lua-5.1.exe  - <<EOT
tbl = setmetatable( {objeto = "cadeira", preco = 1.99 } , {  __tostring = function( self )  return string.format('o objeto %q custa R$%.2f', self.objeto, self.preco);  end } );
print( tbl );
EOT

retorno: o objeto "cadeira" custa R$1.99

Com isso além um "formato" mais legível pode ser utilizado para serialização e/ou outros fins.

Dai no caso foi usar a ideia do toString() comumente usado no Java para uma representação.

Reply all
Reply to author
Forward
0 new messages