Lua:"隐藏"函数

我想从lua中调用C函数来改变在C中定义的变量,但我不希望lua "user" 意识到它们是函数。

例如,考虑在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函数。

谢谢。

点赞
用户5636775
用户5636775

当你设置

L_level = 2

你实际上是使用键 L_level 索引全局表 _G 并将其设置为 2。你可以为 _G 设置一个元表,并将函数 __newindex 设置为一个函数,该函数检查键是否为 L_levelL_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)
        end
    end
})

在这种情况下,do_setleveldo_setmap 是全局 C 函数。当然,你也可以完全在 C 中完成所有这些。

2020-02-17 19:45:32