gpt4 book ai didi

lua - 将 userdate 视为 Lua 中的表

转载 作者:行者123 更新时间:2023-12-04 07:29:25 30 4
gpt4 key购买 nike

我想向 Lua 公开一些 C++ 类。我可以调用Widget:New()获取带有元表集的返回用户数据到表 WidgetMeta . WidgetMeta包含所有 C++ 函数,它是 __index设置为自身,所以我可以这样做:

w = Widget:New()
w:Foo() -- Foo is defined in C code

这一切都很简单。

现在这是我无法弄清楚的部分。我希望能够将 Lua 定义的变量和函数放在我的用户数据上,就好像它是一个表一样。这显然不能直接完成。我不能把它放在用户数据上,因为我希望它对每个用户数据都是唯一的。
w1 = Widget:New()
w2 = Widget:New()

function w1:Bar() print "Hello!" end -- Both functions unique
function w1:Baz() print "World!" end -- to their own userdata

我目前的攻击计划是让元表上有一个特殊的表,它在用户数据和表之间映射,我可以在其中存储每个用户数据的函数和变量。问题是我不确定最好的方法是什么,或者是否有更好的解决方案。所以我的问题是双重的:当我设置我的 __index 和 __newindex 元方法时,我是在文本文件中用 Lua 代码编写它们并在运行其余内容之前运行它,还是直接从 C 中放置 Lua 代码通过 luaL_loadstring 在我的程序中添加字符串,还是使用 C 接口(interface)来处理所有堆栈操作?其次,我该如何编写该函数……但是一旦我决定了最佳路线,我就会处理这个问题。

最佳答案

向用户数据添加一个函数环境,并通过它重定向访问。

这是我的一些描述该过程的旧代码。

static int l_irc_index( lua_State* L )
{
/* object, key */
/* first check the environment */
lua_getfenv( L, -2 );
lua_pushvalue( L, -2 );
lua_rawget( L, -2 );
if( lua_isnoneornil( L, -1 ) == 0 )
{
return 1;
}

lua_pop( L, 2 );

/* second check the metatable */
lua_getmetatable( L, -2 );
lua_pushvalue( L, -2 );
lua_rawget( L, -2 );

/* nil or otherwise, we return here */
return 1;
}

static int l_irc_newindex( lua_State* L )
{
/* object, key, value */

lua_getfenv( L, -3 );
lua_pushvalue( L, -3 );
lua_pushvalue( L, -3 );
lua_rawset( L, -3 );

return 0;
}

关于lua - 将 userdate 视为 Lua 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332448/

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