Lua的插件框架API

我正在为一个应用程序实现一个 Lua 脚本插件系统。基本上,它将允许用户通过定义一个或多个 Lua 函数来扩展功能。插件函数将在应用程序事件的响应中被调用。

有没有一些好的 Lua 开源插件框架可以作为模型?

特别是我想知道最好的方法是如何将参数传递给插件并接收返回的值,既灵活又易于插件编写者使用的方式。

只是为了澄清,我关心的是从 Lua 脚本编程的角度设计 API,而不是从托管应用程序的角度。

关于在 Lua 中设计插件系统的建议或最佳实践将不胜感激。

原文链接 https://stackoverflow.com/questions/6180239

点赞
stackoverflow用户41661
stackoverflow用户41661

Lua 的一等函数使得这种东西变得非常简单,我认为你不会在框架方面找到太多。请记住 Lua 的口号是提供最小的机制,让个人程序员自己制定策略。

虽然你的问题很普遍,但这是我为你的 API 建议的:

  • 一个单一的插件应该有一个单独的 Lua 表示(就像一个 Lua 模块由单个表表示一样)。
  • 表的字段应包含表的操作或回调。
  • 共享状态不应该存储在表中;它应该存在于创建表的代码的本地变量中,例如,
local initialized = false

return {
   init = function(self, t) ... ; initialized = true end,
   something_else = function (self, t)
                      if not initialized then error(...) end
                      ...
                    end,
   ...
}
  • 你还可以看到我建议所有插件操作使用相同的接口:

    1. 插件的第一个参数是表本身
    2. 唯一的其他参数是一个包含操作所需的所有其他信息的表。
    3. 最后,每个操作都应返回一个结果表格。

之所以传递和返回单个表而不是位置结果,是因为它将帮助您在接口演变时保持代码兼容。

总之,大胆使用表和一等函数,并保护插件的私有状态。

2011-05-30 22:03:16
stackoverflow用户501459
stackoverflow用户501459

插件功能将在应用程序事件的响应中调用。

这表明使用观察者模式。例如,如果您的应用程序有两个事件,“foo”和“bar”,您可以编写如下内容:

HostApp.listeners = {
   foo = {},
   bar = {},
}
function HostApp:addListener(event, listener)
   table.insert(self.listeners[event], listener)
end
function HostApp:notifyListeners(event, ...)
   for _,listener in pairs(self.listeners[event]) do
      listener(...)
   end
end

然后当foo事件发生时:

self:notifyListeners('foo', 'apple', 'donut')

感兴趣foo事件的客户端(例如插件)只需注册一个监听器:

HostApp:addListener('foo', function(...)
   print('foo happened!', ...)
end)

根据需要进行扩展。

特别是,我想知道传递参数给插件和接收返回值的最佳方法是什么?

插件只提供给您一个要调用的函数。您可以传递任何参数,并根据需要处理其返回值。

2011-05-31 01:18:01