Lua教程(十一):模块与包详解
从Lua5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块。从使用者的角度来看,一个模块就是一个程序库,可以通过require来加载,之后便得到一个类型为table的全局变量。此时的table就像名字空间一样,可以访问其中的函数和常量,如:
require"mod" mod.foo() localm2=require"mod2" localf=mod2.foo f()
1.require函数:
require函数的调用形式为require"模块名"。该调用会返回一个由模块函数组成的table,并且还会定义一个包含该table的全局变量。在使用Lua中的标准库时可以不用显示的调用require,因为Lua已经预先加载了他们。
require函数在搜素加载模块时,有一套自定义的模式,如:
?;?.lua;c:/windows/?;/usr/local/lua/?/?.lua
在上面的模式中,只有问号(?)和分号(;)是模式字符,分别表示require函数的参数(模块名)和模式间的分隔符。如:调用require"sql",将会打开以下的文件:
sql sql.lua c:/windows/sql /usr/local/lua/sql/sql.lua
Lua将require搜索的模式字符串放在变量package.path中。当Lua启动后,便以环境变量LUA_PATH的值来初始化这个变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。如果require无法找到与模块名相符的Lua文件,就会找C程序库。C程序库的搜索模式存放在变量package.cpath中。而这个变量则是通过环境变量LUA_CPATH来初始化的。
2.编写模块的基本方法:
见如下代码和关键性注释:
--将模块名设置为require的参数,这样今后重命名模块时,只需重命名文件名即可。 localmodname=... localM={} _G[modname]=M
M.i={r=0,i=1} --定义一个模块内的常量。 functionM.new(r,i)return{r=r,i=i}end functionM.add(c1,c2) returnM.new(c1.r+c2.r,c1.i+c2.i) end
functionM.sub(c1,c2) returnM.new(c1.r-c2.r,c1.i-c2.i) end --返回和模块对应的table。 returnM