簡體   English   中英

API 用於 Lua 中的插件框架

[英]API for plugin framework in Lua

我正在為應用程序實現一個帶有 Lua 腳本的插件系統。 基本上,它將允許用戶通過在 Lua 中定義一個或多個函數來擴展功能。 插件 function 將被調用以響應應用程序事件。

Lua 中是否有一些好的開源插件框架可以充當 model?

特別是我想知道將參數傳遞給插件並接收返回值的最佳方式是什么,這種方式對於插件編寫者來說既靈活又易於使用。

澄清一下,我對 API 的設計感興趣是從 Lua 中的腳本編程的角度來看,而不是從托管應用程序的角度來看。

任何其他與 Lua 中的插件系統設計相關的建議或最佳實踐將不勝感激。

Lua 的一流函數使這種事情變得如此簡單,以至於我認為您不會在框架的方式中找到太多東西。 請記住,Lua 的口頭禪是提供最小的機制,讓程序員自己制定策略。

您的問題非常籠統,但這是我為您的 API 推薦的內容:

  • 單個插件應由單個 Lua 表表示(就像 Lua 模塊由單個表表示)。

  • 表的字段應包含表的操作或回調。

  • 共享的 state不應存儲在表中; 它應該存儲在創建表的代碼的局部變量中,例如,

     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. 最后,每個操作都應該返回一個結果表。

    傳遞和返回單個表而不是位置結果的原因是,它將幫助您隨着接口的發展保持代碼兼容。

總之,積極使用表和一等函數,並保護你的插件的私有 state

插件 function 將被調用以響應應用程序事件。

這暗示了觀察者模式。 例如,如果您的應用程序有兩個事件,“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)

擴展以滿足您的需求。

特別是我想知道將參數傳遞給插件並接收返回值的最佳方法是什么

該插件只是為您提供 function 來調用。 您可以將任何您想要的參數傳遞給它,並按照您的意願處理它的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM