nginx lua 模块开发

定义模块的方式

定义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()
  1. module() 第一个参数就是模块名,若是不设置,缺省使用文件名。
  2. 第二个参数package.seeall,默认在定义了一个module()以后,前面定义的全局变量就都不可用了,包括print函数等,若是要让以前的全局变量可见,必须在定义module的时候加上参数package.seeall。 具体参考云风这篇文章

之因此再也不推荐module("...", package.seeall)这种方式,官方给出了两个缘由。函数

  1. package.seeall这种方式破坏了模块的高内聚,本来引入oldmodule只想调用它的foo()函数,可是它却能够读写全局属性,例如oldmodule.os.
  2. 第二个缺陷是module函数的side-effect引发的,它会污染全局环境变量。
    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

上面的?表明的就是包名。

相关文章
相关标签/搜索