Lua更多语法与使用

news2024/11/24 18:46:31

文章目录

  • 目的
  • 错误处理
  • 元表和元方法
  • 垃圾回收
  • 协程
  • 模块
  • 面向对象
  • 总结

目的

在前一篇文章: 《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) -- 抛出错误
end

ret, msg = pcall(func1, "hello naisu!")
print("pcall: ", ret, msg)

-- xpcall (f, msgh [, arg1, ···]) 和pcall类似,第二个参数为错误处理函数

function func2()
  print(debug.traceback())
end

ret, msg = xpcall(func1, func2, "hello naisu!")
print("xpcall: ", ret, msg)

元表和元方法

Lua中可以给值(变量)添加一个原表,元表中可以是各种元方法。元方法用于改变该对象的默认行为,比如该对象运算时的行为,格式化输出时的行为等。

使用 setmetatable (table, metatable) 方法向 table 添加一个 metatablemetatablenil 时用于移除元表;使用 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})

do
  local 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弱引用,所以这个表将被GC

collectgarbage() -- 强制执行一次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 = self
  self.name = name
  return obj
end

function Class:printName()
  print(self.name);
end

obj1 = Class:new("naisu") -- 新建一个对象

print(obj1.name) -- 使用 . 访问属性
obj1:printName() -- 使用 : 调用方法

obj2 = Class:new("nx233") 
obj2:printName()

总结

上面的一些Lua的语法功能使得Lua更加灵活和完善,不单单作为脚本,进行大型项目开发也可一用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

漏极开路/集电极开路OD/OC上拉电阻选型参数确定方法及应用场景经验总结

🏡《电子元器件学习目录》 目录 1,概述2,最小值2.1,饱和区2.2,逻辑低电平3,最大值3.1,驱动能力3.2,信号上升沿4,应用场景5,总结1,概述 如下图所示MOS管的集电极开路直接输出的形式被称为OD输出;如果使用的是三极管则被称为OC输出。在实际使用中OD或OC输出需要根据…

【Git】中Gui的使用和SSH协议的讲解及IDEA开发中使用git

目录 一、Gui使用 1. 使用 2. 功能 二、SSH协议 1. 讲解 2. 生成密钥 3. 远程仓库绑定公钥 三、IDEA使用 1. IDEA配置git 2. IDEA安装gitee 3. IDEA中登入Git 4. 项目分享 5. 克隆分享的项目 6. idea上传远程 一、Gui使用 (Gui) 是指图形用户界面&#xff0c;它…

半导体高加速应力测试及标准

半导体高加速应力测试及标准 随着电气和电子元件变得越来越密集&#xff0c;现在对零件和材料的高度加速应力测试的需求更大。 高加速应力测试系统&#xff08;HAST 室&#xff09;主要设计用于使用设定的施加电压和信号进行偏置测试。 控制功能可选择标准的不饱和控制和湿饱和…

SLAM从入门到精通(光源的控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;图像在二维码、道路检测、故障物检测方面都有很重要的作用。但是&#xff0c;这里面就有一个前提&#xff0c;那就是图像…

月销破30万辆后,比亚迪整了波大的

最近乘联会公布了 2023 年 10 月新能源乘用车厂商销量榜单。 其中最为亮眼犹如鹤立鸡群的榜首&#xff0c;没错依然是我们熟悉的那个迪子&#xff01; 单月销量超 30 万辆&#xff0c;相较去年同期暴涨 38.4%&#xff0c;创下了比亚迪有史以来新高。 同时也成为了国内首个月销…

秋招进入尾声了,还有哪些公司和岗位可以投递?

24届秋招基本已经进入尾声了&#xff0c;接下来就是秋招补录了&#xff0c;最近在微信群看到一些同学再问哪些公司还在招人的。 在这里跟大家分享一份2024届秋招信息汇总表&#xff0c;目前已更新2000家&#xff0c;不仅有互联网公司&#xff0c;还有外企、国企、各类研究所&am…

基于SSM的个人网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

神奇工具!这7个软件让设计轻松起飞

作为一个设计小白&#xff0c;你还在问前辈们有没有好的设计软件吗&#xff1f;还是没地方问&#xff0c;只能去百度搜索&#xff1f;如果是这样&#xff0c;那么接下来的文章正好可以解决你的问题。本文将介绍7种常用的平面设计工具&#xff0c;每种平面设计工具都有自己的特点…

Sprint Boot 学习路线 3

嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能&#xff0c;它允许你在应用程序中直接运行 Web 服务器&#xff0c;无需将其部署到单独的独立 Web 服务器中。这使得开发、测试和部署 Web 应用程序变得容易&#xff0c;而且它还是轻量级的、易于启动和停止…

基于SSM的游戏销售系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

用朴素贝叶斯实现垃圾邮箱分类实验报告

一、实验目的 1.会用Python创建朴素贝叶斯模型 2.使用朴素贝叶斯模型对垃圾邮件分类 3.会把文本内容变成向量 4.会用评价朴素贝叶斯模型的分类效果 二、设备与环境 Jupyter notebook Python3.9 三、实验原理 四、实验内容 1.把给定的数据集message.csv拆分成训练集和测试集&…

jsvascript使用dhtmlXTreeObject的loadJSONObject绘制目录树

文章目录 1&#xff0c;引入dhtmlXTreeObject的css和js文件2&#xff0c;创建一棵目录树2.1&#xff0c;let tree new dhtmlXTreeObject(id-dhtmltree-0, "100%", "100%", 0);2.2&#xff0c;设置图片根目录&#xff08;后续使用到的图片都是相对于该目录…

基于insightface实现的人脸检测,人脸识别,insightface源码讲解。

目录 1.搭建insightface需要的环境 2.下载insightface工程 3.代码工程文件讲解 3.1 python-package 3.2 进行测试 3.3 examples 4. 人脸识别 5.代码理解&#xff1a; 1.搭建insightface需要的环境 埋个坑&#xff0c;后续再写&#xff0c;笔者在安装过程中遇到了一些问题。…

你知道Online DDL吗?

什么是Online DDL&#xff1f; 在线DDL&#xff08;Online Data Definition Language&#xff09;是指在数据库运行状态下执行数据定义语言&#xff08;DDL&#xff09;操作&#xff0c;例如创建、修改或删除表结构、索引等操作&#xff0c;而不会造成数据库的长时间锁定或无法…

C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)

今天在看之前收藏的一个pdf文档(介绍C#外挂的相关知识的)&#xff0c;结合网上的东西及个人的理解才有了这篇文章。 参考文章&#xff1a; 【精选】一文带解读C# 动态拦截覆盖第三方进程中的函数&#xff08;外挂必备&#xff09;_zls365365的博客-CSDN博客 DotNetDetour - …

【经验模态分解】4.信号由时域向频域的转换

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file 傅里叶变换与小波变换* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian&#xff08;黑曜石笔记软件&#…

Git的进阶操作,在idea中部署gie

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

CCIA数安委等组织发布PIA星级标识名单,合合信息再次通过数据安全领域权威评估

近期&#xff0c;“中国网络安全产业联盟&#xff08;CCIA&#xff09;数据安全工作委员会”、“数据安全共同体计划&#xff08;DSC&#xff09;”等组织共同发起“个人信息保护影响评估专题工作&#xff08;简称“PIA专题工作”&#xff09;”&#xff0c;并为入围企业颁发了…

交通信号标志识别系统 python 深度学习 YOLOv5

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多的人 。 1、项目介绍 本系统基于YOLOv5&#xff0c;采用登录注册进行用…