2014-09-05 35 views
1

我有了它必須代表一個Lua模塊串一個小C程序,它看起來像這樣:Ç - LuaJit指定自定義模塊的名稱爲編譯字符串

const char *lua_str = " local mymodule = {} \ 
    function mymodule.foo() \ 
     print(\"Hello World!\") \ 
    end 
    return mymodule"; 

或許用老辦法( 如果需要):

const char *lua_str = "module(\"mymodule\", package.seeall \ 
    function foo() \ 
     print(\"Hello World!\") \ 
    end"; 

而且我們認爲這是我的小主機應用程序:

#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 

int main(int argc, char** argv) 
{ 
    lua_State *L = lua_open(); 
    luaL_openlibs(L); 

    luaL_dostring(L, lua_str); 
    luaL_dofile(L, "test.lua"); 

    return 0; 
} 

現在test.lua能夠使用的模塊,具有靜態名未通過文件名決定:

local mymodule = require "mymodule" 
mymodule.foo() 

基本上,我需要執行該字符串,並給它一個代表實際模塊名稱的自定義名稱。目前這個名字是由文件名決定的,我不想那樣。

回答

2

如果你看一下documentation for require

加載特定的模塊。該功能首先查看 package.loaded表來確定modname是否已經加載。 如果是,則需要返回存儲在 package.loaded [modname]中的值。否則,它會嘗試爲 模塊找到加載程序。

要查找加載器,require需要由package.loaders數組指導。通過更改這個數組, ,我們可以改變需求查找模塊的方式。 以下說明基於 package.loaders的默認配置。

首先需要查詢package.preload [modname]。如果它有一個值, 這個值(這應該是一個函數)是加載器。否則, 需要使用存儲在 package.path中的路徑搜索Lua加載程序。如果這也失敗了,它將使用package.cpath中存儲的 路徑搜索C加載程序。如果這也失敗了,它會嘗試一個 all-in-one加載器(請參閱package.loaders)。

一旦找到裝載程序,require會調用帶有單個 參數modname的裝載程序。如果加載器返回任何值,則需要將返回值分配給package.loaded [modname],即 。如果加載程序返回 沒有值並且沒有爲package.loaded [modname], 分配任何值,則require要爲此條目賦值true。無論如何,要求返回 package.loaded [modname]的最終值。

如果加載或運行模塊時出現任何錯誤,或者找不到該模塊的任何加載程序,則需要發出錯誤信息。

您會看到它詳細解釋了require用於查找給定模塊名稱的代碼的方法。這個解釋暗示瞭如何將任意塊的加載(或可加載)代碼分配給任何你想要的名字。

具體而言,如果您在package.loaded[modname]中設置了一個值,該值將立即返回。否則,package.preload[modname]將用作加載程序(這是一個使用模塊名稱的函數)。

+0

所以基本上所有我需要做的就是把我的表放在我的模塊名稱下'package.loaded [「mymodule」] = {}'。或者只需放置一個函數,當模塊首次被需要時返回實際的表格'package.preload [「mymodule」] = function(mod)return {} end'。這是否是一個正確的方法? – 2014-09-05 02:37:58

+2

最簡單的方法是加載第一個沒有運行的例子,然後將它存儲在'package.preload'中。 – 2014-09-05 02:58:37