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之路由层
文章目录 路由匹配语法路由配置注意事项转换器注册自定义转化器 无名分组和有名分组无名分组有名分组 反向解析简介普通反向解析无名分组、有名分组之反向解析 路由分发简介为什么要用路由分发?路由分发实现 伪静态的概念名称空间虚拟环境什么是虚拟环境?…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...
