Lua模組與包學習筆記_Lua

來源:互聯網
上載者:User

從 Lua 5.1 開始,Lua 加入了標準的模組管理機制,可以把一些公用的代碼放在一個檔案裡,以API 介面的形式在其他地方調用,有利於代碼的重用和降低代碼耦合度。

建立模組

其實 Lua 的模組是由變數、函數等已知元素組成的 table,因此建立一個模組很簡單,就是建立一個 table,然後把需要匯出的常量、函數放入其中,最後返回這個 table 就行。格式如下:

複製代碼 代碼如下:

-- 定義一個名為 module 的模組
module = {}
 
-- 定義一個常量
module.constant = "this is a constant"
 
-- 定義一個函數
function module.func1()
    io.write("this is a public function!\n")
end
 
local function func2()
    print("this is a private function!")
end
 
function module.func3()
    func2()
end
 
return module

由上可知,模組的結構就是一個 table 的結構,因此可以像操作調用 table 裡的元素那樣來操作調用模組裡的常量或函數。不過上面的 func2 聲明為程式塊的局部變數,即表示一個私人函數,因此是不能從外部存取模組裡的這個私人函數,必須通過模組裡的共有函數來調用。

最後,把上面的模組代碼儲存為跟模組名一樣的 lua 檔案裡(例如上面是 module.lua),那麼一個自訂的模組就建立成功。

載入模組

Lua 提供一個名為 require 的函數來載入模組,使用也很簡單,它只有一個參數,這個參數就是要指定載入的模組名,例如:

複製代碼 代碼如下:

require("<模組名>")
-- 或者是
-- require "<模組名>"

然後會返回一個由模組常量或函數組成的 table,並且還會定義一個包含該 table 的全域變數。

或者給載入的模組定義一個別名變數,方便調用:

複製代碼 代碼如下:

local m = require("module")
 
print(m.constant)
 
m.func3()

載入機制

對於自訂的模組,模組檔案不是放在哪個檔案目錄都行,函數 require 有它自己的檔案路徑載入策略,它會嘗試從 Lua 檔案或 C 程式庫中載入模組。

require 用於搜尋 Lua 檔案的路徑是存放在全域變數 package.path 中,當 Lua 啟動後,會以環境變數 LUA_PATH 的值來初始這個環境變數。如果沒有找到該環境變數,則使用一個編譯時間定義的預設路徑來初始化。

當然,如果沒有 LUA_PATH 這個環境變數,也可以自訂設定,在目前使用者根目錄下開啟 .profile 檔案(沒有則建立,開啟 .bashrc 檔案也可以),例如把 "~/lua/" 路徑加入 LUA_PATH 環境變數裡:

複製代碼 代碼如下:

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

檔案路徑以 ";" 號分隔,最後的 2 個 ";;" 表示新加的路徑後面加上原來的預設路徑。

接著,更新環境變數參數,使之立即生效:

複製代碼 代碼如下:

source ~/.profile

這時假設 package.path 的值是:

複製代碼 代碼如下:

/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

那麼調用 require("module") 時就會嘗試開啟以下檔案目錄去搜尋目標

複製代碼 代碼如下:

/Users/dengjoe/lua/module.lua;
./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

如果找過目標檔案,則會調用 package.loadfile 來載入模組。否則,就會去找 C 程式庫。搜尋的檔案路徑是從全域變數 package.cpath 擷取,而這個變數則是通過環境變數 LUA_CPATH 來初始。搜尋的策略跟上面的一樣,只不過現在換成搜尋的是 so 或 dll 類型的檔案。如果找得到,那麼 require 就會通過 package.loadlib 來載入它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.