模塊 (Modules)
為了讓程式碼更容易維護,我們常會將關連的函式或資料一起放在一個獨立的 .lua 檔,這一個 lua 檔案就被稱為模塊 (Modules)。舉例來說,你可以在檔案 do-math.lua 建立一個與數學運算相關的模塊。
----------------
-- do-math.lua
----------------
local M = {} -- Empty table; "M" can be any variable name you like, but most people use "M" for "module"
function M.addNumbers( number1, number2 ) --Add a function to the module
return number1 + number2
end
return M
存取模塊時,必須使用 require()
,接著便可以使用模塊內定義的功能,調用時不需指定 .lua 副檔名。
----------------
-- call-math.lua
----------------
local do_math = require( "do_math" ) -- Omit the .lua extension here
print( do_math.addNumbers( 10, 15 ) ) -- prints 25
模塊的運作原理其實很簡單,當第一次調用 require()
,被 require 的檔案會被從頭被執行一次,以 do_math.lua
為例:第一次被調用時,會先建立一個表格 M
,接著在 M 建立方法 addNumber
,最後將 M 回傳。因此 call-math.lua 中的 do_math
變數就會是 do_math.lua 中的 M
,也因此可以透過 do_math
變數調用 do_math.lua 中的方法。
必須特別注意的是:當再次調用 require()
引用相同模塊後,該模塊檔案就不會被執行了。那麼這時候 require()
會回傳什麼呢? 答案不是 nil
,而是第一次調用該模塊時的回傳值。換句話說,模塊只要被加載一次,只要程式結束前都會一直存在在記憶體,不需要再重複加載。lua 這樣的行為可以增加程式運作的效率,但相對的會消耗較多的記憶體,也因此要記得移除程式中不再被使用的模塊。