参考链接:
系列链接: Lua语法(一)
系列链接: Lua语法(二)——闭包/日期和时间
系列链接: Lua语法(三)——元表与元方法
系列链接: Lua语法(四)——协程
系列链接: Lua语法(五)——垃圾回收
系列链接: Lua语法(六)——面相对象编程
Lua语法 目录二
- 概述
- 闭包
- 模块和包
- 模块和包相关函数
- dofile、loadfile和require 的区别
- require
- dofile
- loadfile
- 模式匹配
- 模式串含义
- string.find
- string.gsub
- string.match
- string.gmatch
- 日期和时间
- os.time
- os.date
- os.difftime
- 位运算
- 编译、执行和错误处理
- 1.预编译
- 2.错误处理
概述
关于闭包,模块和包的概念。
Lua中的闭包、模块和包都是用来组织和封装代码的机制。
闭包
闭包是指一个函数和其相关的环境变量的组合。当一个函数在其外部定义的环境中使用某些变量时,这些变量将会保存在闭包中,使得函数可以在其定义之外的地方继续使用这些变量。使用闭包可以实现很多高级的编程技巧,例如函数工厂、延迟计算等。
--闭包案例:url解码
str = "word=%22%E4%BD%A0%E5%A5%BD%22;name=%22%E5%BC%A0%E4%BC%9F%22"
function urldecode(s)s = string.gsub(s,"+"," ")s = string.gsub(s,"%%(%x%x)",function (h)return string.char(tonumber(h,16))end)return s
endprint(urldecode(str))
--输出 word="你好";name="张伟"
模块和包
Lua5.1以后,引入了模块和包
可以将其他lua文件作为模块,让当前lua文件调用
模块和包相关函数
dofile、loadfile和require 的区别
在Lua语言中,dofile、loadfile和require都是用于加载和执行Lua代码的函数,但它们之间有一些区别。
dofile函数是最简单的加载和执行Lua代码的方式。它接受一个文件路径作为参数,并返回执行结果。dofile函数会直接加载并执行指定路径的Lua脚本文件,返回脚本的执行结果。每次调用dofile函数都会重新加载和执行脚本文件。
loadfile函数用于加载Lua代码块并返回一个函数。它接受一个文件路径作为参数,并返回一个函数对象,该函数可以用于多次执行该代码块。loadfile函数只加载并编译脚本文件,不会立即执行代码。调用返回的函数对象可以多次执行代码块,每次执行返回执行结果。
require函数是用于加载和执行Lua模块的函数。它接受一个模块名作为参数,并返回模块的返回值。require函数先检查指定的模块是否已经加载,如果已经加载则直接返回模块的返回值。如果模块尚未加载,则会搜索Lua模块路径来查找并加载对应的Lua文件。require函数只会加载和执行模块一次,后续调用require函数会直接返回缓存的模块返回值。
需要注意的是,dofile和loadfile可以加载任意的Lua代码文件,而require函数则只能加载具有特定规范的Lua模块文件。
案例:
如果模块名和文件名不一致,那么需要将模块所在的文件放到Lua根目录下的lua文件夹里面
如果模块名和文件名一致,则可以将模块所在的文件和当前文件放在同一个文件夹下,所以,建议让模块名和文件名保持一致
例如模块名 叫 model ,那么文件名叫 model.lua为一致
否则模块会require调用失败
require
--model.lua
local model = {}model.wwww = function ()print("test")
endreturn model --这里不要忘记return--test.lua
local mod =require("model") --可以自定义一个本地的名字mod.wwww()
--输出 test
dofile
读取文件并直接运行
--block.lua
print("here is block")local function block()print("bolck fun is doi