J'essaie d'utiliser la fonction comme métatable. __index
pour obtenir plus de flexibilité, mais il s'est planté lorsque la valeur retournée n'est pas assignée à une variable du côté Lua.
C'est la partie C++, elle crée simplement une variable de table dont le nom est __index
pointe vers une fonction C, la fonction renvoie simplement une valeur numérique fixe :
int meta_index( lua_State* lua )
{
juce::Logger::writeToLog( "meta_index with key " + juce::String( lua_tostring( lua, 2 ) ) );
lua_pushnumber( lua, 123.456 );
return 1;
}
int main()
{
lua_State* lua = luaL_newstate();
luaL_openlibs( lua );
// create a table with __index slot
lua_createtable( lua, 0, 0 );
lua_pushstring( lua, "__index" );
lua_pushcfunction( lua, meta_index );
lua_settable( lua, -3 );
lua_setglobal( lua, "test_meta" );
// run lua code
luaL_loadstring( lua, lua_src );
lua_call( lua, 0, 0 );
lua_close( lua );
}
Et voici le code Lua qui provoque le crash :
const char* lua_src =
"a = {}\n"
"setmetatable(a, test_meta)\n"
"a.foo\n";
Le code s'est écrasé antes de Fonction C meta_index
est effectivement appelé, et il réclame un message d'erreur tentative d'appeler une valeur de type chaîne .
Cependant, si je mets l'expression a.foo
qui déclenche la méta indexation à droite de l'affectation, le code se termine sans erreur et produit le résultat attendu :
const char* lua_src =
"a = {}\n"
"setmetatable(a, test_meta)\n"
"bar = a.foo\n"
"print(bar)\n";
Il semble que Lua traite le foo
en a.foo
y bar = a.foo
comme des choses différentes, quelle est la règle réelle pour cela ?