gpt4 book ai didi

lua - 如何在 Lua-C API 5.2 中创建类对象?

转载 作者:行者123 更新时间:2023-12-03 23:11:53 25 4
gpt4 key购买 nike

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

#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");
}

当我运行这个 Lua 时:

local foo = Foo.new()
foo:dosomething()

...我看到这个输出(有错误):

## new
## __index
Failed to run script: script.lua:2: attempt to call method 'dosomething' (a nil value)

我究竟做错了什么?

最佳答案

好的,开始工作了。我不得不添加 __index__metatableFoo的新元表,如下图:

void register_foo_class(lua_State* L) {
int lib_id, meta_id;

/* newclass = {} */
lua_createtable(L, 0, 0);
lib_id = lua_gettop(L);

/* metatable = {} */
luaL_newmetatable(L, "Foo");
meta_id = lua_gettop(L);
luaL_setfuncs(L, _meta, 0);

/* metatable.__index = _methods */
luaL_newlib(L, _methods);
lua_setfield(L, meta_id, "__index");

/* metatable.__metatable = _meta */
luaL_newlib(L, _meta);
lua_setfield(L, meta_id, "__metatable");

/* class.__metatable = metatable */
lua_setmetatable(L, lib_id);

/* _G["Foo"] = newclass */
lua_setglobal(L, "Foo");
}

关于lua - 如何在 Lua-C API 5.2 中创建类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11100435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com