如何从C语言运行多个Lua脚本实例

我有以下的 Lua 脚本:

mydata={}
function update(val)
    mydata["x"] = val
    if (val == 10)
      -- 调用 C-Api(1)
    else
       -- 当空闲或发生某些事件时,向 C 注册回调
       register_callback(callme)
end
function callme()

end

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

基本上,脚本文件是我正在尝试实现的一种规则。系统上的几个事件可以触发此规则或脚本文件。我想根据触发它的事件来处理此规则。可能会有多个事件同时触发此脚本运行。因此,我需要有多个实例的此脚本,这些实例由触发它的事件类型区分。

总之,我希望每个调用者都有单独的 mydata 实例。

我想实现类似于这样的东西。我在某个地方读到过,我们应该能够在加载脚本之前通过加载新的环境来运行多个实例的 lua 脚本,但我找不到确切的细节。

有人能帮帮我吗?

点赞
用户1442917
用户1442917

虽然我仍然不确定你想要实现什么,不过如果你想要有两个相同函数的实例并保持它们使用的数据是私有的,你只需要创建一个闭包并返回一个匿名函数,供你的 C 代码使用。

这样做应该可以:

function createenv(callme)
  local mydata={}
  return function (val) -- 返回匿名函数
    mydata["x"] = val
    if (val == 10)
      -- 调用 C-Api(1)
    else
       --当空闲或发生某些事件时,向 C 注册回调
       register_callback(callme)
    end
  end
end

现在在你的代码(C 或 Lua)中的某个地方,你可以这样做:

local update = createenv(function() --[[做任何事情]] end)
update(10)

然后在另一个部分,你可以这样做:

local update = createenv(function() --[[做其他事情]] end)
update(20)

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

2015-10-09 04:32:58