Lua的require使用
一.require的作用
- 載入指定的模組,相當與#include作用類似,載入了該模組,那麼就可已使用模組中的全域性函式和全域性資料(如表等等)
注:實際上require “xxx”後,會將xxx中的全域性函式和資料放到表_G中,所以也就能訪問了。
2.例子
(1)main.lua
require "test"
require "showSome"
(2)test.lua
function CallFunc()
//這裡能呼叫show(),證明了_G中有show這個元素
show()
end
(3)showSome.lua
function show()
print("it is showsome")
end
(4)testLua.cpp
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L,"Lua//main.lua");
lua_getglobal(L,"CallFunc");
lua_pcall(L,0,0,0);
return 0;
}
二.require的搜尋模組的路徑
1.搜尋lua檔案的路徑存放在變數package.path中,當lua啟動後便以環境變數LUA_PATH的值來初始化這個變數,如果沒有找到,則使用2中的的預設路徑。如果lua還是無法找到與模組命符合的lua檔案,那麼它會開始找c程式庫,路徑儲存在package.cpath中,這個變數通過環境變數LUA_CPATH來初始化。
2.require的預設路徑在:luaconf.h中,我們開啟該檔案搜尋:LUA_PATH_DEFAULT ,便可以看到
#deine LUA_PATH_DEFAULT \
LUA_LDIR”?.lua;” LUA_LDIR”?\init.lua;” \
LUA_CDIR”?.lua;” LUA_CDIR”?\init.lua;” \
LUA_SHRDIR”?.lua;” LUA_SHRDIR”?\init.lua;” \
“.\?.lua;” “.\?\init.lua;” \
LUA_CDIR”..\testLua\Lua\?.lua;” –這句是我自己加的
#deine LUA_CPATH_DEFAULT\
LUA_CDIR”?.dll;” \
LUA_CDIR”..\lib\lua\” LUA_VDIR “\?.dll;” \
LUA_CDIR”loadall.dll;” “.\?.dll”
注:
1.修改了luaconf.h中的路徑後,我們需要重新生成新的lua靜態lib庫,然後我們的程式使用新的靜態lib,這樣才能起效
2.可以看到預設的路徑的格式為: ?.lua , 所以我們require “xxx”,而不是require “xxx.lua”
三.require的返回值
require “xxx” 某個模組後
1.如果該模組自身有返回值,且模組載入成功,那麼require 的返回值就是該模組的返回值
2.如果模組沒有返回值,如果require載入模組成功,就返回ture
3.require 內部將返回值儲存在:package.loaded表中。
(即:package.loaded[xxx]中)
4.例子
(1)main.lua
x = require "test"
function Call()
x.show()
end
(2)test.lua
local tb = {}
function tb.show()
print("it is ok")
end
return tb
(3)testLua.cpp
int _tmain(int argc, _TCHAR* argv[])
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L,"Lua//main.lua");
lua_getglobal(L,"Call");
lua_pcall(L,0,0,0);
return 0;
}
四. require的實現程式碼
function require(name)
if not package.loaded[name] then
local loader = findloader(name)
if loader == nil then
error("unable to load module" .. name)
end
package.loaded[name] = true
local res = loader(name)
if res ~= nil then
package.loaded[name] = res
end
end
return package.loaded[name]
end