• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
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/sunlong88/p/17950636

posted on 2024-01-07 15:41  孙龙-程序员  阅读(49)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3