加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua的require使用

发布时间:2020-12-14 21:58:53 所属栏目:大数据 来源:网络整理
导读:一.require的作用 加载指定的模块,相当与#include作用类似,加载了该模块,那么就可已使用模块中的全局函数和全局数据(如表等等) 注:实际上require “xxx”后,会将xxx中的全局函数和数据放到表_G中,所以也就能访问了。 2.例子 ( 1 )main.lua require "t

一.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);
    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”..testLuaLua?.lua;” –这句是我自己加的

#deine LUA_CPATH_DEFAULT
LUA_CDIR”?.dll;”
LUA_CDIR”..liblua” 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,"Call");
    lua_pcall(L,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读