estoy envolviendo una función C con Lua, mediante la API de Lua-C para Lua 5.2:¿Cómo creo un objeto de clase en Lua-C API 5.2?
#include <lua.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
int foo_gc();
int foo_index();
int foo_newindex();
int foo_dosomething();
int foo_new();
struct foo {
int x;
};
static const luaL_Reg _meta[] = {
{"__gc", foo_gc},
{"__index", foo_index},
{"__newindex", foo_newindex},
{ NULL, NULL }
};
static const luaL_Reg _methods[] = {
{"new", foo_new},
{"dosomething", foo_dosomething},
{ NULL, NULL }
};
int foo_gc(lua_State* L) {
printf("## __gc\n");
return 0;
}
int foo_newindex(lua_State* L) {
printf("## __newindex\n");
return 0;
}
int foo_index(lua_State* L) {
printf("## __index\n");
return 0;
}
int foo_dosomething(lua_State* L) {
printf("## dosomething\n");
return 0;
}
int foo_new(lua_State* L) {
printf("## new\n");
lua_newuserdata(L,sizeof(Foo));
luaL_getmetatable(L, "Foo");
lua_setmetatable(L, -2);
return 1;
}
void register_foo_class(lua_State* L) {
luaL_newlib(L, _methods);
luaL_newmetatable(L, "Foo");
luaL_setfuncs(L, _meta, 0);
lua_setmetatable(L, -2);
lua_setglobal(L, "Foo");
}
Cuando ejecuto este Lua:
local foo = Foo.new()
foo:dosomething()
... Veo esta salida (con error):
## new
## __index
Failed to run script: script.lua:2: attempt to call method 'dosomething' (a nil value)
¿Qué estoy haciendo mal? Gracias
Pruebe 'for k, v en pares (getmetatable (foo)) do print (k, v) end'. – lhf
En Lua 5.2, puede usar 'luaL_setmetatable (L," Foo ")' en lugar de 'luaL_getmetatable (L," Foo "); lua_setmetatable (L, -2); ' – lhf
OT: No debe usar' __' en los identificadores en C. – u0b34a0f6ae