修改lua的檔案載入器,自定義lua檔案載入

2021-07-02 00:44:29 字數 1999 閱讀 4182

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...