Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Lua-CAPI5.2中创建类对象?_Lua - Fatal编程技术网

如何在Lua-CAPI5.2中创建类对象?

如何在Lua-CAPI5.2中创建类对象?,lua,Lua,我正在用Lua包装一个C函数,使用Lua 5.2的Lua-C API: #包括 #包括 #包括 #包括 int foo_gc(); int foo_index(); int foo_newindex(); int foo_dosomething(); int foo_new(); 结构foo{ int x; }; 静态常量luaL_Reg_meta[]={ {u_gc',foo_gc}, {u__索引,foo_索引}, {uuuuNewIndex],foo\uNewIndex}, {NULL,N

我正在用Lua包装一个C函数,使用Lua 5.2的Lua-C API:

#包括
#包括
#包括
#包括
int foo_gc();
int foo_index();
int foo_newindex();
int foo_dosomething();
int foo_new();
结构foo{
int x;
};
静态常量luaL_Reg_meta[]={
{u_gc',foo_gc},
{u__索引,foo_索引},
{uuuuNewIndex],foo\uNewIndex},
{NULL,NULL}
};
静态常数法[]={
{“新”,foo_new},
{“dosomething”,foo_dosomething},
{NULL,NULL}
};
int foo_gc(卢厄州*L){
printf(“##uu gc\n”);
返回0;
}
int foo_newindex(lua_State*L){
printf(“新索引”);
返回0;
}
int foo_索引(lua_状态*L){
printf(“索引”);
返回0;
}
国际食品标准(卢厄州*L){
printf(“##dosomething\n”);
返回0;
}
int foo_new(卢厄州*L){
printf(“新的”);
lua_newuserdata(L,sizeof(Foo));
luaL_getmetatable(L,“Foo”);
lua_可设置元表(L,-2);
返回1;
}
无效寄存器\u foo\u类(lua\u State*L){
luaL_newlib(L,_方法);
luaL_newmetatable(L,“Foo”);
luaL_setfuncs(L,_meta,0);
lua_可设置元表(L,-2);
lua_setglobal(L,“Foo”);
}
当我运行此Lua时:

localfoo=foo.new()
foo:dosomething()
…我看到此输出(有错误):

##新
##_uuu指数
无法运行脚本:script.lua:2:尝试调用方法“dosomething”(一个nil值)

我做错了什么?

好的,开始工作了。我不得不将
\uuu索引
\uu元表
添加到
Foo
的新元表中,如下所示:

void register\u foo\u类(lua\u State*L){
int lib_id,meta_id;
/*newclass={}*/
lua_创建表(L,0,0);
lib_id=lua_gettop(L);
/*元表={}*/
luaL_newmetatable(L,“Foo”);
meta_id=lua_gettop(L);
luaL_setfuncs(L,_meta,0);
/*元表。\索引=\方法*/
luaL_newlib(L,_方法);
lua_设置字段(L,元id,“u索引”);
/*元表。\元表=\元表*/
luaL_newlib(L,_meta);
lua_设置字段(L,元id,“uu元表”);
/*类。\元表=元表*/
lua_可设置元表(L,lib_id);
/*_G[“Foo”]=newclass*/
lua_setglobal(L,“Foo”);
}

我尝试回复您的解决方案,但显然我还没有这样做的声誉,所以这里有一个单独的答案

您的解决方案非常好,但它不允许我想做的事情:既有对对象的“类似数组”的访问,又有对对象的函数。请查看此Lua代码:

Foo = {}

mt = {
__index = function(table, key)
  print("Accessing array index ", tostring(key), "\n")
  return 42
end
}
setmetatable(Foo, mt)

Foo.bar = function()
  return 43
end

print(tostring(Foo[13]), "\n")
print(tostring(Foo.bar()), "\n")

--[[
Output:
Accessing array index 13
42
43
]]--
使用您的解决方案注册类似乎不允许这样做,因为
\u索引
项被覆盖。 在一个类上同时具有数组访问和函数访问可能没有意义,但是为了简单起见(提供一个C函数来注册这两种类型的类),我希望在任何地方都使用相同的代码。有人知道如何绕过这个限制,以便我可以从C创建一个既有函数Foo.bar()又有函数Foo[13]的类吗