Lua更多语法与使用
文章目录
- 目的
- 错误处理
- 元表和元方法
- 垃圾回收
- 协程
- 模块
- 面向对象
- 总结
目的
在前一篇文章: 《Lua入门使用与基础语法》 中介绍了一些基础的内容。这里将继续介绍Lua一些更多的内容。
同样的本文参考自官方手册:
https://www.lua.org/manual/
错误处理
下面代码可以直接测试相关内容:
-- 使用 assert (v [, message]) 可以检查条件v,如果失败则抛出错误信息message--[[
使用 error (message [, level]) 抛出错误信息message
level为1时(默认值)会在message头部添加调用error函数的位置信息;
level为2时会添加调用error的函数被调用的位置信息;
level为0时不添加额外信息。
]]-- 使用 pcall() (f [, arg1, ···]) 执行函数并捕获可能的错误。执行无错误返回true,否则返回false和错误对象。function func1(arg)error(arg) -- 抛出错误
endret, msg = pcall(func1, "hello naisu!")
print("pcall: ", ret, msg)-- xpcall (f, msgh [, arg1, ···]) 和pcall类似,第二个参数为错误处理函数function func2()print(debug.traceback())
endret, msg = xpcall(func1, func2, "hello naisu!")
print("xpcall: ", ret, msg)
元表和元方法
Lua中可以给值(变量)添加一个原表,元表中可以是各种元方法。元方法用于改变该对象的默认行为,比如该对象运算时的行为,格式化输出时的行为等。
使用 setmetatable (table, metatable)
方法向 table
添加一个 metatable
, metatable
填 nil
时用于移除元表;使用 getmetatable (object)
返回对象的原表。
常见的运算相关元方法如下:
元方法 | 运算 | 元方法 | 运算 | 元方法 | 运算 | 元方法 | 运算 |
---|---|---|---|---|---|---|---|
__add | + | __sub | - | __mul | * | __div | / |
__mod | % | __pow | ^ | __unm | - | __idiv | // |
__band | & | __bor | | | __bxor | ~(异或) | __bnot | ~(非) |
__shl | << | __shr | >> | __concat | … | __len | # |
__eq | == | __lt | < | __le | <= |
除了上面一些基础的运算相关的元方法,Lua中还有更多元方法,下面是个基本的测试:
--[[ 下面是__index ]]
print("__index:")t1 = setmetatable({ a=22 },{ __index = function() return 33 end})print(t1.a)
print(t1.b) -- 访问不存在的元素t2 = setmetatable({ a=22 },{ __index = { b=33 }})print(t2.a)
print(t2.b) -- 访问不存在的元素
print(t2.c) -- 访问不存在的元素--[[ 下面是__newindex ]]
print("__newindex:")t3 = setmetatable({ a=22 },{ __newindex = function (table, key, value) print(#table, key, value) end})print(t3.a)
t3.b = 33 -- 设置不存在的元素时会调用__newindex
print(t3.b) -- __newindex是函数时,值并不会设置到table中t4 = setmetatable({ a=22 },{ __newindex = function (table, key, value) rawset(table, key, value * 2) end})print(t4.a)
t4.b = 33 -- 设置不存在的元素时会调用__newindex
print(t4.b) -- rawset方法将新元素添加到table中t5 = {}
t6 = setmetatable({ a=22 },{ __newindex = t5})
t6.b = 33
print(t6.b) -- __newindex是表时,设置不存在的元素,值并不会设置到table中
print(t5.b) -- __newindex是表时,设置不存在的元素,值会设置到元表中--[[ 下面是__call ]]
print("__call:")t7 = setmetatable({ a=22 },{ __call = function (table, value) print(table.a, value) end})t7(33) -- __call方法会在把表当函数用的时候被调用--[[ 下面是__close ]]
print("__close:")t8 = setmetatable({ a=22 },{ __close = function (table) print(table.a) end})dolocal var<close> = t8
end
-- close属性的变量会在退出其作用域时调用__close方法--[[ 下面是__tostring ]]
print("__tostring:")t9 = setmetatable({ a=22 },{ __tostring = function (table) return "value: "..table.a end})print(tostring(t9)) -- __tostring方法会在使用tostring函数时被调用
垃圾回收
Lua是带垃圾回收功能的,通常不用手动去控制它,如果有特殊需求的话可以使用 collectgarbage ([opt [, arg]])
方法来手动控制垃圾收集器。比如使用 collectgarbage("collect")
进行一次完整的垃圾回收、使用 collectgarbage("count")
获得Lua占用的内存数据(单位为1024字节)。
另外如果一个表被其他表引用的话,该表不会被回收,可以用过弱表来处理该情况:
t1 = {}setmetatable(t1, {__mode = "k"}) -- 设置表的key为弱类型k1 = {}
t1[k1] = 22
k2 = {}
t1[k2] = 33
k1 = nil -- 将k1删除,k1引用的那个表只存在于t1,但t1是key弱引用,所以这个表将被GCcollectgarbage() -- 强制执行一次GC
for k, v in pairs(t1) do print(v) end
协程
Lua中的协程和大多数语言中的协程差不多,提供了一些协程创建、启动、挂起等方法,协程需要主动交出控制权。
coroutine.create (f)
传入函数创建协程返回协程句柄;coroutine.resume (co [, val1, ···])
运行协程,传入协程句柄和参数;成功时返回true和返回值;失败时返回false和错误信息;coroutine.yield (···)
协程主动暂停,输入的参数是传递给resume的返回值;coroutine.close (co)
关闭协程coroutine.wrap (f)
传入函数创建协程返回函数,调用该函数相当于调用resume;coroutine.isyieldable ([co])
coroutine.running ()
返回正在运行的协程加上一个布尔值,当正在运行的协程是主协程时为true。coroutine.status (co)
下面代码是个简单的测试:
function func()print("协同程序 func 开始执行")local value = coroutine.yield("暂停 func 的执行")print("协同程序 func 恢复执行,传入的值为: " .. tostring(value))print("协同程序 func 结束执行")
end-- 创建协同程序
local co = coroutine.create(func)-- 启动协同程序
local status, result = coroutine.resume(co)
print(result) -- 输出: 暂停 func 的执行-- 恢复协同程序的执行,并传入一个值
status, result = coroutine.resume(co, 233)
print(result) -- 输出: 协同程序 func 恢复执行,传入的值为: 233
模块
当需要多个文件组合实现功能时就涉及到模块的概念的,简单理解就是一个文件引用其他文件:
面向对象
Lua也支持面向对象的方式,本质其实就是table中同时放变量和函数等。稍稍比table使用多一点的内容是可以使用 :
来定义个使用table中的函数,这样这个函数内部默认会有一个指向自身的 self
对象。
下面代码可以直接测试相关内容:
Class = {}function Class:new(name) -- 注意这里内部的操作,这个方法相当于构造函数obj = {}setmetatable(obj,self)self.__index = selfself.name = namereturn obj
endfunction Class:printName()print(self.name);
endobj1 = Class:new("naisu") -- 新建一个对象print(obj1.name) -- 使用 . 访问属性
obj1:printName() -- 使用 : 调用方法obj2 = Class:new("nx233")
obj2:printName()
总结
上面的一些Lua的语法功能使得Lua更加灵活和完善,不单单作为脚本,进行大型项目开发也可一用。
相关文章:

Lua更多语法与使用
文章目录 目的错误处理元表和元方法垃圾回收协程模块面向对象总结 目的 在前一篇文章: 《Lua入门使用与基础语法》 中介绍了一些基础的内容。这里将继续介绍Lua一些更多的内容。 同样的本文参考自官方手册: https://www.lua.org/manual/ 错误处理 下…...

探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用
目录 一、什么是海外服务器 二、不同主流海外云服务器对比 三、海外服务器的创建(亚马逊为例) 四、个人总结 一、什么是海外服务器 亚马逊云科技海外服务器:指的是部署在世界各地的亚马逊数据中心中的服务器设备。这些服务器提供了计算、存储、数据库、网络等各…...
UnityAI——动物迁徙中的跟随实现实例
大家好,我是七七,今天来给大家介绍的是Unity中用操控行为实现的跟随领队行为。 看本文若是想了解和实现,只看本文即可,若是想彻底弄透,建议从七七的游戏AI专栏开始看。 废话不多说,先上视频: …...

堆的应用-----Top k 问题
目录 前言 Topk问题 1.问题描述 2.解决方法 3.代码实现(C/C) 前言 在人工智能算法岗位的面试中,TopK是问得最多的几个问题之一: 到底有几种方法? 这些方案里蕴含的优化思路究竟是怎么样的? 为啥T…...

11月14日星期二今日早报简报微语报早读
11月14日星期二,农历十月初二,早报微语早读。 1、江西南城县:限时发放购房补贴政策,三孩家庭每平方米最高补贴500元; 2、2023年中国内地电影市场累计票房突破500亿元; 3、市场监管总局:在全国…...

Spark读取excel文件
文章目录 一、excel数据源转成csv二、Spark读取csv文件(一)启动spark-shell(二)读取csv生成df(三)查看df内容一、excel数据源转成csv 集群bigdata - ubuntu: 192.168.191.19master(bigdata1) - centos: 192.168.23.78 slave1(bigdata2) - centos: 192.168.23.79 slave2(b…...

LLM大语言模型(典型ChatGPT)入门指南
文章目录 一、基础概念学习篇1.1 langchain视频学习笔记1.2 Finetune LLM视频学习笔记 二、实践篇2.1 预先下载模型:2.2 LangChain2.3 Colab demo2.3 text-generation-webui 三、国内项目实践langchain-chatchat 一、基础概念学习篇 1.1 langchain视频学习笔记 lan…...

Spring IOC - Bean的生命周期之实例化
在Spring启动流程文章中讲到,容器的初始化是从refresh方法开始的,其在初始化的过程中会调用finishBeanFactoryInitialization方法。 而在该方法中则会调用DefaultListableBeanFactory#preInstantiateSingletons方法,该方法的核心作用是初始化…...
前端 BUG 总结
文章目录 CSS 样式1、Chrome 89 版本期不再支持 /deep/,请勿使用嵌套 /deep/2、圆角按钮 button 点击后出现矩形框线3、怪异模式4、border 1 像素在手机上显示问题5、文本溢出问题 JavaScript 脚本1、移动端点击穿透2、使用parseInt时必须补全第二个参数 radix3、有…...

【蓝桥杯软件赛 零基础备赛20周】第3周——填空题
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 文章目录 00. 2023年第14届参赛数据0. 上一周答疑1. 填空…...

Pytorch自动混合精度的计算:torch.cuda.amp.autocast
1 autocast介绍 1.1 什么是AMP? 默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起ÿ…...

一文看懂香港优才计划和高才通计划的区别和优势?如何选?
一文看懂香港优才计划和高才通计划的区别和优势?如何选? 为什么很多人都渴望有个香港身份? 英文这里和内地文化相近,语言相通,同时税率较低、没有外汇管制,有稳定金融体制和良好的营商环境,诸多…...

DTC Network旗下代币DSTC大蒜头即将上线,市场热度飙升
全球数字资产领导者DTC Network宣布其代币DSTC(大蒜头)即将于近期上线,引发市场广泛关注。DTC Network以其创新性的区块链技术和多维度的网络构建,致力于打造一个融合Web3.0、元宇宙和DAPP应用的去中心化聚合公共平台,…...

高通SDX12:ASoC 音频框架浅析
一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…...

国际化:i18n
什么是国际化? 国际化也称作i18n,其来源是英文单词 internationalization的首末字符和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲࿰…...

【机器学习5】无监督学习聚类
相比于监督学习, 非监督学习的输入数据没有标签信息, 需要通过算法模型来挖掘数据内在的结构和模式。 非监督学习主要包含两大类学习方法: 数据聚类和特征变量关联。 1 K均值聚类及优化及改进模型 1.1 K-means 聚类是在事先并不知道任何样…...

风景照片不够清晰锐利,四招帮你轻松解决
我们大家在拍摄风景照的时候都希望能够拍摄出清晰锐利的照片。可能会有人问:“什么是锐利?”我们可以从锐度来给大家简单解说下。锐度是反映图片平面清晰度和图像边缘对比度的一个参数。锐度较高的画面,微小的细节部分也会表现得很清晰&#…...

List中的迭代器实现【C++】
List中的迭代器实现【C】 一. list的结构二. 迭代器的区别三. 迭代器的实现i. 类的设计ii. 重载iii. !重载iiii. begin()iiiii. end()iiiii. operator* 四.测试五. const迭代器的实现i. 实现ii 优化实现 六. 整体代码 一. list的结构 其实按照习惯来说,应该要专门出…...

VB.NET三层之用户查询窗体
目录 前言: 过程: UI层代码展示: BLL层代码展示: DAL层代码展示: 查询用户效果图: 总结: 前言: 想要对用户进行查询,需要用到控件DataGrideView,通过代码的形式将数据库表中的数据显示在DataGrideview控件中,不用对DatGridView控件…...

Django之路由层
文章目录 路由匹配语法路由配置注意事项转换器注册自定义转化器 无名分组和有名分组无名分组有名分组 反向解析简介普通反向解析无名分组、有名分组之反向解析 路由分发简介为什么要用路由分发?路由分发实现 伪静态的概念名称空间虚拟环境什么是虚拟环境?…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...