定義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 |
上面的?表明的就是包名。