当前位置: 首页 > news >正文

Lua 基础 04 模块

Lua 基础相关知识 第四期

require

模块,通常是一个表,表里存储了一些字段和函数,单独写在一个 lua 文件。

例如,这是一个 tools.lua 文件,定义了一个局部 tools 表,包含一个 log 函数,可以传入标题和信息,函数内部格式化字符串输出。

最后要 return tools,在 require 加载这个模块时才能拿到返回的 tools 表。

local tools = {}tools.log = function (title, message)print(string.format("[%s] %s", title, message))
endreturn tools

在其他 lua 文件中加载这个 tools 模块,进行使用。

local tools = require "tools"
tools.log("console", "hello lua")-- [console] hello lua

标准库也可以通过 require 加载,换个名称。

local m = require "math"
local n = m.abs(-1)
print(n)-- 1

require 会做已加载的检查,如果已经加载过一个模块了,就不会再重复加载了。

如果要移除原来加载的模块,可以把模块从 package.loaded 中删除。

package.loaded.tools = nil

loadfile dofile require

这三个函数都是用来加载和执行外部 lua 脚本的,不过有一些区别:

  • loadfile 加载编译指定的 lua 文件,但不执行文件中的代码,需要手动调用(返回值是一个函数)
  • dofile 加载编译并执行指定的 lua 文件(返回值是文件中最后一个表达式的值)
  • require 先检查 package.loaded 是否已加载模块,若已加载,则直接返回,若不存在,则编译执行一次,并记录到 package.loaded(返回值通常是一个表)

这里所说的执行,是指被加载的 lua 文件中,写在表外面可以被执行的语句,例如在 tools 中添加一行打印,表示欢迎使用这个模块。

local tools = {}print("Welcome to use this tools module!")tools.log = function (title, message)print(string.format("[%s] %s", title, message))
endreturn tools

先尝试使用 loadfile,注意,第一行代码加载的是 tools.lua,需要增加 .lua 后缀名,第一行并没有输出。

第二行代码打印了 loadfile 的返回值,输出的是一个 function。

第三行代码手动调用了返回的函数,才执行了 tools.lua 里面的一行打印。

local tools = loadfile("tools.lua")
print(tools)  -- function: 0000025E2F7791D0
tools()       -- Welcome to use this tools module!

再尝试一下 dofile,同样的,第一行代码加载的是 tools.lua,第一行就输出了。

第二行代码打印的返回值是 table,也就是 tools.lua 最后一行的 return tools

第三行代码则不是直接调用 tools 了,因为它并不是一个函数。应该调用 tools.log

local tools = dofile("tools.lua")  -- Welcome to use this tools module!
print(tools)                       -- table: 00000150C5D61D30
tools.log("console", "hello lua")  -- [console] hello lua

最后回到 require,注意,第一行代码没有 .lua 后缀名,第一行就输出了。

后面两行代码和 dofile 是一致的。

local tools = require("tools")     -- Welcome to use this tools module!
print(tools)                       -- table: 0000025D08BF13D0
tools.log("console", "hello lua")  -- [console] hello lua

如果再次加载 lua 文件,loadfile 依然是需要手动调用,dofile 会再次输出,require 则只输出一次,除非移除已加载的模块。

local tools_loadfile = loadfile("tools.lua")
local tools_loadfile = loadfile("tools.lua")local tools_dofile = dofile("tools.lua")  -- Welcome to use this tools module!
local tools_dofile = dofile("tools.lua")  -- Welcome to use this tools module!local tools_require = require("tools")    -- Welcome to use this tools module!
local tools_require = require("tools")package.loaded.tools = nil
local tools_require = require("tools")    -- Welcome to use this tools module!

相关文章:

  • Linux 系统安全及应用
  • FFmpeg解复用器(解封装)简单测试【2】
  • 每日一练——分糖果2
  • 【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器
  • CAPL如何发送一条UDP报文
  • 独立游戏开发的 6 个步骤
  • 游戏找不到d3dcompiler43.dll怎么办,分享5种有效的解决方法
  • 【全开源】种草分享|动态朋友圈|瀑布流|uniapp
  • MySQL—约束—外键约束(基础)
  • Scala 柯里化、sortBy方法
  • Linux配置java,maven,marshalsec环境
  • 实现Dropdown下拉菜单监听键盘上下键选中功能-React
  • vue3状态管理,pinia的使用
  • JavaScript、Kotlin、Flutter可以开发鸿蒙APP吗?
  • HTTP --tcp和keep-alive
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ESLint简单操作
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • EventListener原理
  • express如何解决request entity too large问题
  • java中具有继承关系的类及其对象初始化顺序
  • jQuery(一)
  • Redis学习笔记 - pipline(流水线、管道)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 关于Java中分层中遇到的一些问题
  • 基于 Babel 的 npm 包最小化设置
  • 使用common-codec进行md5加密
  • 小程序 setData 学问多
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 新书推荐|Windows黑客编程技术详解
  • 应用生命周期终极 DevOps 工具包
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 《天龙八部3D》Unity技术方案揭秘
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​secrets --- 生成管理密码的安全随机数​
  • ‌移动管家手机智能控制汽车系统
  • # SpringBoot 如何让指定的Bean先加载
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $refs 、$nextTic、动态组件、name的使用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (27)4.8 习题课
  • (function(){})()的分步解析
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (十)T检验-第一部分
  • (十八)SpringBoot之发送QQ邮件
  • (一)80c52学习之旅-起始篇
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Linux下编译安装log4cxx
  • *p++,*(p++),*++p,(*p)++区别?
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复