Lua的require機制

在Lua中,有模塊這個定義,加載一個模塊須要使用require函數,require是一個全局函數。html

require有兩個寫法require("modname")和require "modname"函數

1.首先require函數會查找package.loaded表,檢測modname是否加載過,若是加載過,則再也不加載,若是沒加載過,則繼續ui

2.require加載模塊的按照package.searchers序列的指引來查找加載器,使用另外一個全局函數loader()實現,PS:package.searchers序列能夠需改lua

3.默認的package.searchers序列以下:spa

  • 查詢package.preload[modname],若是有這個值,完工。一般返回爲空
  • 查詢package.path路徑,若是有這個模塊,完工
  • 查詢package.cpath,若是有這個模塊,完工

若是在加載或運行模塊時有錯誤, 或是沒法爲模塊找到加載器, require 都會拋出錯誤。3d

package.config 

一個描述有一些爲包管理準備的編譯期配置信息的串。 這個字符串由一系列行構成:code

  • 第一行是目錄分割串。 對於 Windows 默認是 '\' ,對於其它系統是 '/' 。
  • 第二行是用於路徑中的分割符。默認值是 ';' 。
  • 第三行是用於標記模板替換點的字符串。 默認是 '?' 。
  • 第四行是在 Windows 中將被替換成執行程序所在目錄的路徑的字符串。 默認是 '!' 。
  • 第五行是一個記號,該記號以後的全部文本將在構建 luaopen_ 函數名時被忽略掉。 默認是 '-'。

package.cpath

這個路徑被 require 在 C 加載器中作搜索時用到。htm

Lua 用和初始化 Lua 路徑 package.path 相同的方式初始化 C 路徑 package.cpath 。 它會使用環境變量 LUA_CPATH_5_3 或 環境變量 LUA_CPATH 初始化。 要麼就採用 luaconf.h 中定義的默認路徑。字符串

package.loaded

用於 require 控制哪些模塊已經被加載的表。 當你請求一個 modname 模塊,且 package.loaded[modname] 不爲假時, require 簡單返回儲存在內的值。get

這個變量僅僅是對真正那張表的引用; 改變這個值並不會改變 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 使用的表。

相關文章
相關標籤/搜索