定义module有两种方式,旧的方式,适用于Lua 5.0以及早期的5.1版本,新的方式支持新发布的Lua5.1和5.2版本。html
经过module("...", package.seeall)
来显示声明一个包。看不少github上面早期的开源项目使用的都是这种方式,但官方不推荐再使用这种方式。git
定义:github
1 2 3 4 5 6 7 |
-- oldmodule.lua module("oldmodule", package.seeall) function foo() print("oldmodule.foo called") end |
使用:ide
1 2 3 |
require "oldmodule" oldmodule.foo() |
module()
第一个参数就是模块名,若是不设置,缺省使用文件名。module()
以后,前面定义的全局变量就都不可用了,包括print函数等,若是要让以前的全局变量可见,必须在定义module的时候加上参数package.seeall。 具体参考云风这篇文章之因此再也不推荐module("...", package.seeall)
这种方式,官方给出了两个缘由。函数
foo()
函数,可是它却能够读写全局属性,例如oldmodule.os.module("hello.world")
会建立一个hello的table,并将这个table注入全局环境变量中,这样使得不想引用它的模块也能调用hello模块的方法。经过return table来实现一个模块ui
1 2 3 4 5 6 7 |
--newmodule.lua local newmodule = {} function newmodule.foo() print("newmodule.foo called") end return newmodule |
使用lua
1 2 3 |
local new = require "newmodule" new.foo() |
由于没有了全局变量和module关键字,引用的时候必须把模块指定给一个变量。spa
Lua使用require语句来引入第三方模块,code
1 |
require "foo" |
require后面不须要写.lua后缀,解释器会自动加上。htm
require搜索包的路径是package.path
:
1 2 |
> print(package.path) /usr/local/share/lua/5.2/?.lua;/usr/local/share/lua/5.2/?/init.lua;/usr/local/lib/lua/5.2/?.lua;/usr/local/lib/lua/5.2/?/init.lua;./?.lua |
上面的?表明的就是包名。