Lua - 模組



什麼是模組?

模組就像一個庫,可以使用require載入,並且具有包含表格的單個全域性名稱。此模組可以包含許多函式和變數。所有這些函式和變數都被封裝到表格中,該表格充當名稱空間。此外,行為良好的模組具有在 require 時返回此表格的必要規定。

Lua 模組的特性

在模組中使用表格以多種方式幫助我們,並使我們能夠以與操作任何其他 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 中的程式設計是多麼靈活,無需任何額外的特殊程式碼。

require 函式

Lua 提供了一個名為require的高階函式來載入所有必要的模組。它儘可能簡單,以避免在模組上提供過多的資訊來載入它。require 函式只是將模組視為定義某些值的程式碼塊,實際上是包含函式的函式或表格。

示例

讓我們考慮一個簡單的示例,其中一個函式具有數學函式。讓我們將此模組稱為 mymath,檔名是 mymath.lua。檔案內容如下:

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 模組,您需要使用以下程式碼段。

moduletutorial.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 模組如下所示。

mymath.lua

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 中使用模組如下所示。

moduletutorial.lua

require("mymath")

mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)

輸出

當我們執行上述程式碼時,我們將獲得相同的輸出。但是建議不要使用舊版本的程式碼,並且假設它安全性較低。許多使用 Lua 進行程式設計的 SDK(如 Corona SDK)已棄用此用法。

廣告

© . All rights reserved.