【问题标题】:Lua: "Hide" functionsLua:“隐藏”功能
【发布时间】:2020-06-01 18:44:33
【问题描述】:

我想从 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 元方法来完成此操作。

标签: c function api lua


【解决方案1】:

当你设置时

L_level = 2

您确实使用键 L_level 索引全局表 _G 并将其设置为 2。您可以做的是为_G 设置一个meta-table 并将函数__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 好吧,您可以轻松地将方法改编为 C(luaL_setmetatable() 等)
猜你喜欢
  • 2012-09-23
  • 2010-09-17
  • 2010-09-13
  • 2010-09-23
  • 2011-07-21
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多