1. require會搜尋目錄載入檔案
2. require會判斷是否檔案已經載入避免重複載入同一檔案。
require使用的路徑和普通我們看到的路徑還有些區別,我們一般見到的路徑都是乙個目錄列表。require的路徑是乙個模式列表,每乙個模式指明一種由虛檔名(require的引數)轉成實檔名的方法。更明確地說,每乙個模式是乙個包含可選的問號的檔名。匹配的時候lua會首先將問號用虛檔名替換,然後看是否有這樣的檔案存在。如果不存在繼續用同樣的方法用第二個模式匹配。例如,路徑如下:
?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
呼叫require "lili"時會試著開啟這些檔案:
lili
lili.lua
c:\windows\lili
/usr/local/lua/lili/lili.lua
require關注的問題只有分號(模式之間的分隔符)和問號,其他的資訊(目錄分隔符,副檔名)在路徑中定義。
為了確定路徑,lua首先檢查全域性變數lua_path是否為乙個字串,如果是則認為這個串就是路徑;否則require檢查環境變數lua_path的值,如果兩個都失敗require使用固定的路徑(典型的"?;?.lua")
我們在lua中載入檔案只能配置lua_path的值。但是我們在進行遊戲開發的時候,指令碼的路徑可能是千變萬化的,而且有可能是需要打包到乙個專有的檔案格式裡面,這時候原生lua的載入就會出現很多問題了,有沒有更好的方案來載入lua檔案呢?接下來我介紹一種方案來解決這種問題。
我們可以自定義乙個lua檔案的載入器,去替換原生lua的載入器,怎講載入lua檔案由我們自己決定。
首先我們應該有乙個檔案系統來載入資源檔案,如果沒有也沒關係,可以自己寫乙個載入檔案的介面。然後我們寫一段**來呼叫檔案系統或者我們自己寫的介面來載入檔案到記憶體。
示例**如下:
/** 載入lua檔案
@param l lua狀態機
@param name 需要載入的檔名
@return 載入成功返回0
*/
static int luaa_loadfile(lua_state *l, const char *name)
pstream->release();
} }
return status;
}
上面的載入檔案的**可以自己實現。
下一步我們就寫乙個函式上面的載入函式設定給lua,替換lua的原生載入器。
static int luaa_setloader(lua_state *l, lua_cfunction fn)
} return -1;
}
做好上面兩步基本上就已經完成了,有時候我們還用dofile來載入檔案,所以我們需要為dofile也寫乙個類似的函式。
static int luaa_dofile(lua_state * l)
return 0;
}
最後,我們在初始化luastate的時候進行設定就行啦!
bool cluaengine::create(bool bfrompackloadlua)
// 初始化所有的標準庫
lual_openlibs(m_pluastate);
// 替換預設的lua載入函式
luaa_setloader(m_pluastate, luaa_loadfile);
// 初始化一些基本的api
lua_register(m_pluastate, "dofile", luaa_dofile);
return true;
}
好了,這樣無論lua檔案放在那裡,我們就可以隨心所欲的載入lua檔案啦,就像載入其他檔案一樣了。 以自定義方式載入 lua 模組
今天我們的乙個小專案開始做內部測試發布前的資源打包。這個專案基本上是用 lua 做開發的。整個開發過程中,我們的 是直接把 lua 源 放在專案的發布目錄下的。發布版因為安全或是整潔等種種原因,我們必須給所有的指令碼 打包。這種事情以前在大話2 裡也幹過,當時用的 lua 4.0 而且也沒多少經驗,...
自定義類載入器
注 class.forname name,initialize,loader 帶參函式也可控制是否載入static塊。並且只有呼叫了newinstance 方法採用呼叫建構函式,建立類的物件 如果乙個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把請求委託給父載入器去完成,依次向上...
自定義類載入器
我們自己約定的需求如下,我們從外部路徑 tmp myclasspath 載入類 具體實現如下 public class myclassloader extends classloader catch ioexception e 測試 public static void main string ar...