openresty开发系列21--lua的模块
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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") 时就会尝试打开以下⽂件⽬录去搜索⽬标。