在Lua中将用户数据视为表格进行处理。

我有一些C ++类,我想将它们暴露给Lua使用。我可以调用 Widget:New() 来获取返回 user data,并将元表设置为表 WidgetMetaWidgetMeta 包含所有的C ++函数,它的 __index 被设置为它自己,所以我可以这样做:

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

这很简单明了。

现在我遇到了无法解决的部分。我希望能够将Lua定义的变量和函数直接放在我的 user data 上,就像它是一个表一样。显然这是不可能直接实现的。我不能把它放在 user data 上,因为我希望它对于每个 user data 都是唯一的。

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

我当前的解决方案是:在元表上放一个特殊的表,用它来映射 user data 和表,我可以在其中存储各种 user data 的函数和变量。问题是我不确定如何最好地实现它,或者是否有更好的解决方案。所以我的问题有两个方面:当我设置我的 __index__newindex 元方法时,是在文本文件中编写它们的 Lua 代码并在运行其他所有内容之前运行它,还是通过 luaL_loadstring 直接从 C 字符串中放入 Lua 代码,或者使用 C 接口进行处理所有堆栈操作?第二,如何编写该函数……但是,一旦我决定采取哪种方法,我就会处理它。

原文链接 https://stackoverflow.com/questions/3332448

点赞
stackoverflow用户197131
stackoverflow用户197131

给用户数据添加一个函数环境,并通过它重定向访问。 下面是我的一些旧代码,描述了这个过程。

static int l_irc_index( lua_State* L )
{
    /* 对象,键 */
    /* 先检查环境 */
    lua_getfenv( L, -2 );
    lua_pushvalue( L, -2 );
    lua_rawget( L, -2 );
    if( lua_isnoneornil( L, -1 ) == 0 )
    {
        return 1;
    }

    lua_pop( L, 2 );

    /* 然后检查元表 */
    lua_getmetatable( L, -2 );
    lua_pushvalue( L, -2 );
    lua_rawget( L, -2 );

    /* 如果为空,则返回 */
    return 1;
}

static int l_irc_newindex( lua_State* L )
{
    /* 对象,键,值 */

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

    return 0;
}
2010-07-26 07:29:13