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