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

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

相關文章
相關標籤/搜索