国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Lua模塊與包學習筆記

2024-07-21 23:04:20
字體:
來源:轉載
供稿:網友

從 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 來加載它。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 迁西县| 烟台市| 揭阳市| 宁化县| 四会市| 子洲县| 扶风县| 远安县| 龙口市| 鄢陵县| 西宁市| 宽城| 绍兴市| 天峨县| 华坪县| 台中市| 本溪市| 西贡区| 滦南县| 巴中市| 东安县| 夏津县| 清苑县| 长宁县| 墨江| 福泉市| 体育| 如皋市| 东至县| 上蔡县| 石门县| 雅安市| 明溪县| 抚宁县| 襄汾县| 南江县| 镇巴县| 东海县| 松滋市| 福泉市| 三亚市|