如何从C

时间:2015-10-07 18:33:13

标签: lua luac

我有以下lua脚本:

mydata={}
function update(val)
    mydata["x"] = val
    if (val == 10)
      -- Call C-Api(1)
    else
       --Register callback with C when free or some event happens
       register_callback(callme)
end
function callme()

end

基本上我想在我的C程序/进程中运行这个脚本的两个实例,而不必为每个脚本创建一个新的LUA状态。我想从一个实例调用val = 10的函数update(),并从另一个实例调用val = 20的函数update()。从第二个实例开始,它会注册一个回调函数,并等待被调用。

基本上,脚本文件是我想要实现的一种规则。 系统上的几个事件可以触发此规则或脚本文件。我想根据触发它的事件处理此规则。可能有多个事件触发此脚本同时运行。所以我需要让这个脚本的多个实例按触发它的事件类型进行区分。

总结一下,我希望每个调用者都有单独的mydata实例

我想实现这样的目标。我读了一些我们应该能够运行lua脚本的多个实例的地方,而不必通过在加载脚本之前加载新环境来创建新的lua实例

但我无法找到确切的细节。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

虽然我还不确定你究竟想要实现什么,但是如果你想拥有两个相同功能的实例来保持他们使用私有的数据,你只需要创建一个闭包并返回一个您的C代码将使用的匿名函数。

这样的事情应该有效:

function createenv(callme)
  local mydata={}
  return function (val) -- return anonymous function
    mydata["x"] = val
    if (val == 10)
      -- Call C-Api(1)
    else
       --Register callback with C when free or some event happens
       register_callback(callme)
    end
  end
end

现在,您可以执行以下(C或Lua)代码的一部分:

local update = createenv(function() --[[do whatever]] end)
update(10)

然后在另一部分你可以做到:

local update = createenv(function() --[[do something else]] end)
update(20)

彼此之间应该没有任何共同之处。请注意,它们仍然共享相同的Lua状态,但它们的mydata实例将彼此独立。