openresty开发系列21--lua的模块

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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") 时就会尝试打开以下⽂件⽬录去搜索⽬标。

相关文档
最新文档