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?

Foi útil?

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" );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top