1. 程式人生 > >Lua的require使用

Lua的require使用

一.require的作用

  1. 載入指定的模組,相當與#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