Lua的require使用
2015-10-11 19:13
375 查看
一.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
相关文章推荐
- Tengine + Lua + GraphicsMagick
- lua 的安装
- Lua入门
- Windows中编译Lua源码
- lua版本敏感词
- Lua查找表元素过程(元表、__index方法是如何工作的)
- lua对sqlite数据库操作封装
- (使用lua++)Lua脚本和C++交互(三)
- [lua]笔试-按字典序列出指指定的序列的位置
- [lua]笔试-组合概率
- 如何在lua中打印一个数组(table)
- lua中pairs 和 ipairs区别
- lua string.byte 中文处理
- lua学习
- Lua高级教程Metatables
- lua的开始之旅
- lua中实现类的继承
- 关于Lua中const型变量或者常量的实现
- lua中给表(table)重载运算符,使table之间可以互相加减乘除
- Lua学习笔记