gpt4 book ai didi

types - 从C查询Lua用户数据类型

转载 作者:行者123 更新时间:2023-12-02 20:57:45 25 4
gpt4 key购买 nike

我有一个具有特定元表类型的 Lua 用户数据对象(例如 "stackoverflow.test")。从 C 代码中,我希望能够准确检查它是什么类型,并根据结果采取不同的行为。是否有一个很好用的方便函数(类似于 luaL_checkudata,但如果答案不是您想要的,则不会出错)让我查询用户数据的元表类型名称?如果没有,我想我需要使用 lua_getmetatable ,但是我有点不清楚如何确定刚刚添加到堆栈中的元表的名称。

澄清一下:我使用的是 Lua 5.1,其中 luaL_checkudata 的行为已更改。据我所知,在 5.0 中它并没有出现错误。

最佳答案

您始终可以在元表中存储一个标记字段,并使用您的模块特有的轻量级用户数据值。

static const char *green_flavor = "green";
...
void my_setflavor(lua_State *L, void *flavor) {
lua_pushlightuserdata(L,flavor);
lua_pushlstring(L,"_flavor");
lua_rawset(L,-3);
}

void my_isflavor(lua_State *L, void *flavor) {
void *p = NULL;
lua_pushlstring(L,"_flavor");
lua_rawget(L,-2);
p = lua_touserdata(L,-1);
lua_pop(L,1);
return p == flavor;
}

然后可以使用my_setflavor(L,&green_flavor)设置栈顶表的_flavor字段,my_isflavor(L,&red_flavor)设置为测试堆栈顶部表的 _flavor 字段。

以这种方式使用,_flavor 字段只能采用可由范围内具有符号 green_flavor 的模块中的代码创建的值,并且查找该字段并测试其值除了检索之外只需要一次表查找元表本身。请注意,变量 green_flavor 的值并不重要,因为实际仅使用其地址。

通过几个不同的 flavor 变量可用作标记值,_flavor 字段可用于区分几个相关的元表。

综上所述,一个自然的问题是“为什么要这样做?”毕竟,元表可以轻松包含获得适当行为所需的所有信息。它可以轻松保存函数和数据,并且可以从 C 和 Lua 检索和调用这些函数。

关于types - 从C查询Lua用户数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726958/

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