2013-11-25 26 views
2

在我的應用程序中,大多數模塊不是純粹的Lua或純C,而是混合的。作爲C部分的模塊的約定Lua部分

我不知道這些模塊的建議「佈局」是什麼。

到目前爲止,我已經找到了兩種方法:

  1. posix模塊使用C模塊名稱 「posix_c」。用戶不應該使用這個模塊。 Lua模塊,簡稱爲「posix」,導入(並擴充)該模塊。

  2. Awesome窗口管理器將模塊的C部分導出到全局命名空間。由於該名稱不在package.loaded中,所以Lua模塊可以具有相同的名稱。

你推薦什麼方法?還有其他方法嗎?

回答

1

如果用戶不應該使用某些東西,那麼應該隱藏它:要麼在註冊表中,要麼完全隱藏在Lua模塊的upvalue中。這是針對從Lua到C的呼叫。對於從C到Lua的呼叫,唯一的選擇是註冊表,但如果需要,可以以非衝突的方式使用它,如下所述。

因爲它是你的應用程序,你可以簡單地依靠註冊表本身。在我的應用程序中,我註冊了內部C函數,並從Lua端分配了Lua回調。例如。我的Lua核心腳本開頭的一件事是local internal = debug.getregistry()。當所有的核心腳本都加載時,我可以做沙盒,禁止訪問常規腳本來調試庫等。

如果你想創建一個獨立的模塊,我會建議做一個C模塊,當調用Lua腳本時加載後,將「隱藏」表傳遞給它。對於從C到Lua的調用,C代碼可以使用模塊中任何變量的地址作爲light userdata鍵來將「隱藏」表存儲在註冊表中。

+0

謝謝。這不是我正在等待的答案,但我想這沒有「正確的」答案。我最終選擇了'posix'模塊使用的技術。 –