Lua的require机制
在Lua中,有模塊這個定義,加載一個模塊需要使用require函數,require是一個全局函數。
require有兩個寫法require("modname")和require "modname"
1.首先require函數會查找package.loaded表,檢測modname是否加載過,如果加載過,則不再加載,如果沒加載過,則繼續
2.require加載模塊的按照package.searchers序列的指引來查找加載器,使用另一個全局函數loader()實現,PS:package.searchers序列可以需改
3.默認的package.searchers序列如下:
- 查詢package.preload[modname],如果有這個值,完工。通常返回為空
- 查詢package.path路徑,如果有這個模塊,完工
- 查詢package.cpath,如果有這個模塊,完工
如果在加載或運行模塊時有錯誤, 或是無法為模塊找到加載器,?require?都會拋出錯誤。
package.config?
一個描述有一些為包管理準備的編譯期配置信息的串。 這個字符串由一系列行構成:
- 第一行是目錄分割串。 對于 Windows 默認是 '\' ,對于其它系統是 '/' 。
- 第二行是用于路徑中的分割符。默認值是 ';' 。
- 第三行是用于標記模板替換點的字符串。 默認是 '?' 。
- 第四行是在 Windows 中將被替換成執行程序所在目錄的路徑的字符串。 默認是 '!' 。
- 第五行是一個記號,該記號之后的所有文本將在構建?luaopen_?函數名時被忽略掉。 默認是 '-'。
package.cpath
這個路徑被?require?在 C 加載器中做搜索時用到。
Lua 用和初始化 Lua 路徑?package.path?相同的方式初始化 C 路徑?package.cpath?。 它會使用環境變量?LUA_CPATH_5_3?或 環境變量?LUA_CPATH?初始化。 要么就采用?luaconf.h?中定義的默認路徑。
package.loaded
用于?require?控制哪些模塊已經被加載的表。 當你請求一個?modname?模塊,且?package.loaded[modname]?不為假時,?require?簡單返回儲存在內的值。
這個變量僅僅是對真正那張表的引用; 改變這個值并不會改變?require?使用的表。
package.loadlib (libname, funcname)
讓宿主程序動態鏈接 C 庫?libname?。
當?funcname?為 "*", 它僅僅連接該庫,讓庫中的符號都導出給其它動態鏈接庫使用。 否則,它查找庫中的函數?funcname?,以 C 函數的形式返回這個函數。 因此,funcname?必須遵循原型lua_CFunction?。
這是一個低階函數。 它完全繞過了包模塊系統。 和?require?不同, 它不會做任何路徑查詢,也不會自動加擴展名。?libname?必須是一個 C 庫需要的完整的文件名,如果有必要,需要提供路徑和擴展名。funcname?必須是 C 庫需要的準確名字 (這取決于使用的 C 編譯器和鏈接器)。
這個函數在標準 C 中不支持。 因此,它只在部分平臺有效 ( Windows ,Linux ,Mac OS X, Solaris, BSD, 加上支持?dlfcn?標準的 Unix 系統)。
package.path
這個路徑被?require?在 Lua 加載器中做搜索時用到。
在啟動時,Lua 用環境變量?LUA_PATH_5_3?或環境變量LUA_PATH?來初始化這個變量。 或采用?luaconf.h?中的默認路徑。 環境變量中出現的所有 ";;" 都會被替換成默認路徑。
package.preload
保存有一些特殊模塊的加載器
這個變量僅僅是對真正那張表的引用; 改變這個值并不會改變?require?使用的表。
?
轉載于:https://www.cnblogs.com/ideaofnextcy/p/5984721.html
總結
以上是生活随笔為你收集整理的Lua的require机制的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: KnockoutJS 3.X API 第
- 下一篇: Saltstack数据系统Grains和
