Metatabela de ambiente local

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Metatabela de ambiente local

Manoel Campos da Silva Filho
Pessoal, usando setmetatable, eu consigo definir uma metatabela para o ambiente global _G,
permitindo, por exemplo, que ao tentar acessar um valor que não existe, seja gerado um erro.
Por exemplo, se eu tentar fazer print(x) sendo que x não existem, não será impresso nil
e sim gerado um erro indicando que x não existe.

No entanto, quero fazer a mesma coisa para as variáveis locais do escopo atual.
Tentei usar o código que fiz, que funciona para o ambiente global, adaptando-opara o ambiente local. 
Pra mim, a lógica está correta, mas não funciona.
Pesquisei no google e no grupo mas não encontrei nada a respeito.
Segue o código, se alguém puder ajudar.


do
  --obtém o ambiente local
  local _L = getfenv(1)

  --cria os méta-métodos
  function _L:__index(key)
    print("Erro: Tentativa de acesso a um elemento inexistente: "..key)
  end

  function _L:__newindex(key, value)
    print("Criacão de variável "..key.." com valor "..value)
  end

  --define o ambiente local como meta-tabela dele mesmo
  setmetatable(_L, _L)

  print("Imprimindo variável inexistente y: ", y)
  local x = 10
end

logo 
Manoel Campos Silva Fh, Me
IFTO - Instituto Federal do Tocantins

--
Lua BR - http://groups.google.com/group/lua-br
Reply | Threaded
Open this post in threaded view
|

Re: Metatabela de ambiente local

Manoel Campos da Silva Filho
Esqueci de falar, no exemplo, o meta-método newindex nunca é chamado.
Ele deveria ser chamado sempre que eu criar uma variável local atribuindo
valor a ela, como no caso da variável x.

logo 
Manoel Campos Silva Fh, Me
IFTO - Instituto Federal do Tocantins



2012/7/25 Manoel Campos da Silva Filho <[hidden email]>
Pessoal, usando setmetatable, eu consigo definir uma metatabela para o ambiente global _G,
permitindo, por exemplo, que ao tentar acessar um valor que não existe, seja gerado um erro.
Por exemplo, se eu tentar fazer print(x) sendo que x não existem, não será impresso nil
e sim gerado um erro indicando que x não existe.

No entanto, quero fazer a mesma coisa para as variáveis locais do escopo atual.
Tentei usar o código que fiz, que funciona para o ambiente global, adaptando-opara o ambiente local. 
Pra mim, a lógica está correta, mas não funciona.
Pesquisei no google e no grupo mas não encontrei nada a respeito.
Segue o código, se alguém puder ajudar.


do
  --obtém o ambiente local
  local _L = getfenv(1)

  --cria os méta-métodos
  function _L:__index(key)
    print("Erro: Tentativa de acesso a um elemento inexistente: "..key)
  end

  function _L:__newindex(key, value)
    print("Criacão de variável "..key.." com valor "..value)
  end

  --define o ambiente local como meta-tabela dele mesmo
  setmetatable(_L, _L)

  print("Imprimindo variável inexistente y: ", y)
  local x = 10
end

logo 
Manoel Campos Silva Fh, Me
IFTO - Instituto Federal do Tocantins


--
Lua BR - http://groups.google.com/group/lua-br
Reply | Threaded
Open this post in threaded view
|

Re: Metatabela de ambiente local

Elias Barrionovo
In reply to this post by Manoel Campos da Silva Filho
2012/7/25 Manoel Campos da Silva Filho <[hidden email]>
> No entanto, quero fazer a mesma coisa para as variáveis locais do escopo atual.

As variáveis locais não ficam em um ambiente, mas na pilha de
execução. Para conseguir informações sobre elas você precisa usar a
lib 'debug':

http://www.lua.org/manual/5.1/manual.html#5.9

--
NI!

--
Lua BR - http://groups.google.com/group/lua-br
Reply | Threaded
Open this post in threaded view
|

Re: Metatabela de ambiente local

Manoel Campos da Silva Filho
Ah sim, claro. Nem lembrei disso.
Obrigado Elias.

logo 
Manoel Campos Silva Fh, Me
IFTO - Instituto Federal do Tocantins



2012/7/25 Elias Barrionovo <[hidden email]>
2012/7/25 Manoel Campos da Silva Filho <[hidden email]>
> No entanto, quero fazer a mesma coisa para as variáveis locais do escopo atual.

As variáveis locais não ficam em um ambiente, mas na pilha de
execução. Para conseguir informações sobre elas você precisa usar a
lib 'debug':

http://www.lua.org/manual/5.1/manual.html#5.9

--
NI!

--
Lua BR - http://groups.google.com/group/lua-br

--
Lua BR - http://groups.google.com/group/lua-br