Lua:“隐藏”函数

4
我希望能够从Lua调用C函数以更改在C中定义的变量,但我不希望Lua“用户”意识到它们是函数。
例如,在C中创建一个整数和一个数组:
int c_level = 0;
int c_map[4] = {0,0,0,0}; 

现在程序创建了一个Lua状态并运行了以下代码:
set_level(2) --c_level = 2
set_tile(1,23) --c_map[0] = 23

我希望它们在lua脚本中看起来像这样:

L_level = 2
L_map[1] = 23

因此,L_levelL_map将是在C中定义的函数。

L_level的参数将是“2”。

L_map的参数是“1”和“23”。

这可能吗?

我可以使用getglobal获取lua变量,但我想知道是否可以创建一些看起来像我展示的lua函数。

谢谢。


你可以通过轻量级用户数据、__index__newindex 元方法来实现这一点。 - Yakov Galka
1个回答

1
当你设置时:
L_level = 2

你真正索引了全局表_G,使用键L_level并将其设置为2。你可以为_G设置一个元表,并将函数__newindex设置为一个函数,该函数检查键是否为L_level或L_map,并以不同的方式处理这些情况。
这个函数可以直接是C函数或Lua函数,它检查键并调用C函数,如果名称与您跟踪的名称之一匹配,例如:
setmetatable(_G, {
    __newindex = function (_, k, v)
        if (k == "L_level") then do_setlevel(v)
        elseif (k == "L_map") then do_setmap(v)
        else rawset(_G, k, v)
        endif
    end
})

do_setleveldo_setmap在这种情况下是全局C函数。当然,您也可以完全使用C来完成所有操作。


我想用C语言来实现所有功能,谢谢提供的信息 :)。 - Mills
@Mills 好的,你可以很容易地将这种方法适应于C语言(使用luaL_setmetatable()等函数)。 - Ctx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接