openresty开发系列21--lua的模块
openresty開發(fā)系列21--lua的模塊
從lua5.1開始,Lua 加入了標(biāo)準(zhǔn)的模塊管理機(jī)制,Lua 的模塊是由變量、函數(shù)等已知元素組成的 table,
因此創(chuàng)建一個(gè)模塊很簡(jiǎn)單,就是創(chuàng)建一個(gè) table,然后把需要導(dǎo)出的常量、函數(shù)放入其中,最后返回這個(gè) table 就行。
一)模塊定義
模塊的文件名 和 模塊定義引用名稱要一致
-- 文件名為 model.lua
-- 定義一個(gè)名為 model 的模塊
model = {}
?
-- 定義一個(gè)常量
model.constant = "這是一個(gè)常量"
?
-- 定義一個(gè)函數(shù)
function model.func1()
??? print("這是一個(gè)公有函數(shù)")
end
?
local function func2()
??? print("這是一個(gè)私有函數(shù)!")
end
?
function model.func3()
??? func2()
end
?
return model
二)require 函數(shù)
Lua提供了一個(gè)名為require的函數(shù)用來加載模塊。要加載一個(gè)模塊,只需要簡(jiǎn)單地調(diào)用就可以了。例如:
require("<模塊名>")? 或者? require "<模塊名>"
執(zhí)行 require 后會(huì)返回一個(gè)由模塊常量或函數(shù)組成的 table,并且還會(huì)定義一個(gè)包含該 table 的全局變量。
-- test_model.lua 文件
-- model 模塊為上文提到 model.lua
require("model")
?
print(model.constant)
?
model.func3()
另一種寫法,給加載的模塊定義一個(gè)別名變量,方便調(diào)用
local m = require("model")
?
print(m.constant)
?
m.func3()
以上代碼執(zhí)行結(jié)果為:
這是一個(gè)常量
這是一個(gè)私有函數(shù)!
如:模塊定義的model,為local修飾為局部變量,那只能采用local m = require("model") 引用
三)require 加載機(jī)制
我們使用require命令時(shí),系統(tǒng)需要知道引入哪個(gè)路徑下的model.lua文件。
require 用于搜索 Lua 文件的路徑是存放在全局變量 package.path 中,
當(dāng) Lua 啟動(dòng)后,會(huì)以環(huán)境變量 LUA_PATH 的值來初始這個(gè)環(huán)境變量。
如果沒有找到該環(huán)境變量,則使用一個(gè)編譯時(shí)定義的默認(rèn)路徑來初始化。
lua文件的路徑存放在全局變量package.path中,默認(rèn)的package.path的值為 print(package.path)
./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua
我們運(yùn)行require("model");相當(dāng)于把model替換上面的?號(hào),lua就會(huì)在那些目錄下面尋找model.lua如果找不到就報(bào)錯(cuò)。
所以我們就知道為什么會(huì)報(bào)錯(cuò)了。
那我們?nèi)绾谓鉀Q,我這里介紹常用的解決方案,編輯環(huán)境變量LUA_PATH
在當(dāng)前用戶根目錄下打開 .profile 文件(沒有則創(chuàng)建,打開 .bashrc 文件也可以),
例如把 "~/lua/" 路徑加入 LUA_PATH 環(huán)境變量里:
#LUA_PATH
export LUA_PATH="/usr/local/lua/?.lua;;"
文件路徑以 ";" 號(hào)分隔,最后的 2 個(gè) ";;" 表示新加的路徑后面加上原來的默認(rèn)路徑。
接著,更新環(huán)境變量參數(shù),使之立即生效。
source ~/.profile
這時(shí)假設(shè) package.path 的值是:
/usr/local/lua/?.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua
那么調(diào)用 require("model") 時(shí)就會(huì)嘗試打開以下文件目錄去搜索目標(biāo)。
轉(zhuǎn)載于:https://www.cnblogs.com/reblue520/p/11433805.html
總結(jié)
以上是生活随笔為你收集整理的openresty开发系列21--lua的模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openresty开发系列20--lua
- 下一篇: openresty开发系列22--lua