模組是一個可以使用require
載入的庫,並且只有一個包含表的全域性名稱。 模組可以包含許多功能和變數。 所有這些函式和變數都包含在表中,表充當名稱空間。 此外,一個良好的模組有必要的子句,以在使用require
語句時返回此表。
模組中表的使用以多種方式,能夠使用與操作任何其他Lua表相同的方式操作模組。 由於能夠操作模組,它提供了其他語言需要特殊機制的額外功能。 由於Lua中模組的這種自由機制,使用者可以通過多種方式呼叫Lua中的函式。 其中一些操作範例如下所示。
-- Assuming we have a module printFormatter
-- Also printFormatter has a funtion simpleFormat(arg)
-- Method 1
require "printFormatter"
printFormatter.simpleFormat("test")
-- Method 2
local formatter = require "printFormatter"
formatter.simpleFormat("test")
-- Method 3
require "printFormatter"
local formatterFunction = printFormatter.simpleFormat
formatterFunction("test")
在上面的範例程式碼中,可以看到Lua中的程式設計靈活性,沒有任何特殊的附加程式碼。
Lua提供了一個名為require
的高階函式來載入所有必需的模組。 它保持盡可能簡單,以避免有太多關於模組的資訊來載入。 require
函式只是將模組假定為一塊程式碼,它定義了一些值,實際上是包含函式或表。
範例
考慮一個簡單的例子,其中一個函式是數學函式。 將此模組稱為mymath
,檔案名為mymath.lua
。 檔案的程式碼內容如下 -
local mymath = {}
function mymath.add(a,b)
print(a+b)
end
function mymath.sub(a,b)
print(a-b)
end
function mymath.mul(a,b)
print(a*b)
end
function mymath.div(a,b)
print(a/b)
end
return mymath
現在,為了在另一個檔案(例如,moduletutorial.lua
)中存取此Lua模組,需要使用以下程式碼段。
mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)
要執行此程式碼,需要將兩個Lua檔案放在同一目錄中,或者,可以將模組檔案放在包路徑中,它需要額外的設定。 當執行上面的程式時,將得到以下輸出 -
30
10
200
1.5
注意事項
require
函式返回模組,因此模組最好如上所示實現,儘管可以在其他地方找到其他型別的實現。下面將以舊方式重寫上面相同的範例,它使用package.seeall
型別的實現。 這在Lua版本5.1
和5.0
中使用。 mymath
模組如下所示。
module("mymath", package.seeall)
function mymath.add(a,b)
print(a+b)
end
function mymath.sub(a,b)
print(a-b)
end
function mymath.mul(a,b)
print(a*b)
end
function mymath.div(a,b)
print(a/b)
end
moduletutorial.lua 中模組的用法如下所示 -
require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)
當執行上面的操作時,將獲得相同的輸出。 但建議使用較舊版本的程式碼,並假設它不太安全。 許多使用Lua進行程式設計的SDK如Corona SDK都不推薦使用它。