Lua的require使用
一.require的作用
注:實際上require “xxx”后,會將xxx中的全局函數和數據放到表_G中,所以也就能訪問了。
2.例子
(1)main.luarequire "test"require "showSome"(2)test.luafunction CallFunc()//這里能調用show(),證明了_G中有show這個元素show()end(3)showSome.luafunction show()print("it is showsome")end(4)testLua.cppint _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; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
二.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.luax = require "test"function Call()x.show() end(2)test.lualocal tb = {} function tb.show()print("it is ok") endreturn tb(3)testLua.cppint _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; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
四. require的實現代碼
function require(name)if not package.loaded[name] thenlocal loader = findloader(name)if loader == nil thenerror("unable to load module" .. name)endpackage.loaded[name] = truelocal res = loader(name)if res ~= nil thenpackage.loaded[name] = resendendreturn package.loaded[name] end- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
總結
以上是生活随笔為你收集整理的Lua的require使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EDNS
- 下一篇: redis接口的二次封装