主頁 > 知識(shí)庫 > Lua模塊與包學(xué)習(xí)筆記

Lua模塊與包學(xué)習(xí)筆記

熱門標(biāo)簽:地圖標(biāo)注大廈 新岸線智能電銷機(jī)器人 個(gè)人怎么在地圖標(biāo)注需要的店鋪 清朝地圖標(biāo)注哈爾濱 百度地圖標(biāo)注早餐區(qū)域 怎么去除地圖標(biāo)注 冀州市地圖標(biāo)注 漳州智云呼電話機(jī)器人 武漢外呼防封系統(tǒng)多少錢

從 Lua 5.1 開始,Lua 加入了標(biāo)準(zhǔn)的模塊管理機(jī)制,可以把一些公用的代碼放在一個(gè)文件里,以API 接口的形式在其他地方調(diào)用,有利于代碼的重用和降低代碼耦合度。

創(chuàng)建模塊

其實(shí) Lua 的模塊是由變量、函數(shù)等已知元素組成的 table,因此創(chuàng)建一個(gè)模塊很簡單,就是創(chuàng)建一個(gè) table,然后把需要導(dǎo)出的常量、函數(shù)放入其中,最后返回這個(gè) table 就行。格式如下:

復(fù)制代碼 代碼如下:

-- 定義一個(gè)名為 module 的模塊
module = {}
 
-- 定義一個(gè)常量
module.constant = "this is a constant"
 
-- 定義一個(gè)函數(shù)
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

由上可知,模塊的結(jié)構(gòu)就是一個(gè) table 的結(jié)構(gòu),因此可以像操作調(diào)用 table 里的元素那樣來操作調(diào)用模塊里的常量或函數(shù)。不過上面的 func2 聲明為程序塊的局部變量,即表示一個(gè)私有函數(shù),因此是不能從外部訪問模塊里的這個(gè)私有函數(shù),必須通過模塊里的共有函數(shù)來調(diào)用。

最后,把上面的模塊代碼保存為跟模塊名一樣的 lua 文件里(例如上面是 module.lua),那么一個(gè)自定義的模塊就創(chuàng)建成功。

加載模塊

Lua 提供一個(gè)名為 require 的函數(shù)來加載模塊,使用也很簡單,它只有一個(gè)參數(shù),這個(gè)參數(shù)就是要指定加載的模塊名,例如:

復(fù)制代碼 代碼如下:

require("模塊名>")
-- 或者是
-- require "模塊名>"

然后會(huì)返回一個(gè)由模塊常量或函數(shù)組成的 table,并且還會(huì)定義一個(gè)包含該 table 的全局變量。

或者給加載的模塊定義一個(gè)別名變量,方便調(diào)用:

復(fù)制代碼 代碼如下:

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

加載機(jī)制

對(duì)于自定義的模塊,模塊文件不是放在哪個(gè)文件目錄都行,函數(shù) require 有它自己的文件路徑加載策略,它會(huì)嘗試從 Lua 文件或 C 程序庫中加載模塊。

require 用于搜索 Lua 文件的路徑是存放在全局變量 package.path 中,當(dāng) Lua 啟動(dòng)后,會(huì)以環(huán)境變量 LUA_PATH 的值來初始這個(gè)環(huán)境變量。如果沒有找到該環(huán)境變量,則使用一個(gè)編譯時(shí)定義的默認(rèn)路徑來初始化。

當(dāng)然,如果沒有 LUA_PATH 這個(gè)環(huán)境變量,也可以自定義設(shè)置,在當(dāng)前用戶根目錄下打開 .profile 文件(沒有則創(chuàng)建,打開 .bashrc 文件也可以),例如把 "~/lua/" 路徑加入 LUA_PATH 環(huán)境變量里:

復(fù)制代碼 代碼如下:

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

文件路徑以 ";" 號(hào)分隔,最后的 2 個(gè) ";;" 表示新加的路徑后面加上原來的默認(rèn)路徑。

接著,更新環(huán)境變量參數(shù),使之立即生效:

復(fù)制代碼 代碼如下:

source ~/.profile

這時(shí)假設(shè) package.path 的值是:

復(fù)制代碼 代碼如下:

/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

那么調(diào)用 require("module") 時(shí)就會(huì)嘗試打開以下文件目錄去搜索目標(biāo)

復(fù)制代碼 代碼如下:

/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

如果找過目標(biāo)文件,則會(huì)調(diào)用 package.loadfile 來加載模塊。否則,就會(huì)去找 C 程序庫。搜索的文件路徑是從全局變量 package.cpath 獲取,而這個(gè)變量則是通過環(huán)境變量 LUA_CPATH 來初始。搜索的策略跟上面的一樣,只不過現(xiàn)在換成搜索的是 so 或 dll 類型的文件。如果找得到,那么 require 就會(huì)通過 package.loadlib 來加載它。

您可能感興趣的文章:
  • Lua教程(十一):模塊與包詳解
  • Lua中的模塊(module)和包(package)詳解
  • Lua的函數(shù)環(huán)境、包實(shí)例講解
  • Lua調(diào)用自定義C模塊
  • Lua中使用模塊的一些基礎(chǔ)知識(shí)
  • 使用Lua編寫Nginx服務(wù)器的認(rèn)證模塊的方法
  • 在Lua中使用模塊的基礎(chǔ)教程
  • Lua極簡入門指南(六):模塊
  • Lua模塊和模塊載入淺析
  • Lua中的模塊與module函數(shù)詳解
  • 解析Lua中的全局環(huán)境、包、模塊組織結(jié)構(gòu)

標(biāo)簽:金昌 天門 宣城 濰坊 臺(tái)灣 天門 儋州 德宏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua模塊與包學(xué)習(xí)筆記》,本文關(guān)鍵詞  Lua,模塊,與,包學(xué)習(xí),包,學(xué)習(xí),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua模塊與包學(xué)習(xí)筆記》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua模塊與包學(xué)習(xí)筆記的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章