Referência a função Lua em C / C ++
-
06-07-2019 - |
Pergunta
Eu tenho uma série de funções aninhadas relativamente profundamente em um conjunto de tabelas. Existe uma maneira em C / C ++ para obter uma "referência" para a função e empurrar esse (e args) na pilha quando eu precisar usá-lo?
Solução
Este é o que o é para. As lojas chamada de função r = luaL_ref(L, LUA_REGISTRYINDEX)
o valor no topo da pilha no registro e retorna um inteiro que pode ser armazenado no lado do C e usado para recuperar o valor com o lua_rawgeti(L, LUA_REGISTRYINDEX, r)
chamada de função.
Veja a PIL capítulo, bem como a documentação de luaL_ref()
, lua_rawgeti()
, e luaL_unref()
para a história completa.
Outras dicas
A API Lua ( http://www.lua.org/manual /5.1/manual.html#3 ) pode ser usado para acesso quaisquer membros de mesa que você deseja. Use lua_gettable () para extrair um membro mesa e colocá-lo na pilha lua, se o membro é também uma mesa apenas chamar lua_gettable () novamente para acessar esta tabela, e assim por diante ...
(Dependendo do que você está fazendo lua_rawget () pode ser uma escolha melhor do que lua_gettable ())
Addtional em resposta ao comentário:
Tudo bem que é um pouco mais interessante. Bem, uma mesa é um objeto de referência (mais ou menos), assim que você seria provavelmente seguro para guardar a algum lugar referência de tabela mais interna.
Uma vez que a API lua não parece ter qualquer maneira para manipular diretamente a tabela ref de, você provavelmente vai ter que empurrar o árbitro em um global, ou se isso não funcionar uma nova tabela com uma única entrada na tabela. Quando você quer o árbitro mais tarde, basta obtê-lo a partir do global.
por exemplo.
// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );