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) -- 抛出错误
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更加灵活和完善,不单单作为脚本,进行大型项目开发也可一用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node插件MongoDB(四)—— 库mongoose 操作文档使用(新增、删除、更新、查看文档)(二)

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 三、修改文档…

Go基础知识全面总结

文章目录 go基本数据类型bool类型数值型字符字符串 数据类型的转换运算符和表达式1. 算数运算符2.关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符运算符优先级转义符 go基本数据类型 bool类型 布尔型的值只可以是常量 true 或者 false。⼀个简单的例⼦&#…

MIPSsim模拟器 使用说明

&#xff08;一&#xff09; 启动模拟器 双击MIPSsim.exe&#xff0c;即可启动该模拟器。模拟器启动时&#xff0c;自动将自己初始化为默认状态。所设置的默认值为&#xff1a; u所有通用寄存器和浮点寄存器为全0&#xff1b; u内存清零&#xff1b; u流水寄存器为全0&#xff…

C++结构体定义 创建 赋值 结构体数组 结构体指针 结构体嵌套结构体

结构体是什么&#xff1f; struct是自定义数据类型&#xff0c;是一些类型集合组成的一个类型。结构体的定义方式 #include<iostream> using namespace std;struct Student {string name;int age;int score; };创建结构体变量并赋值 方式一&#xff0c;先创建结构体变…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 源码合集&#xff1a;www.yuque.com/mick-hanyi/javaweb 源码下载&#xff1a;博主私 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过…

人工智能技术的高速发展,普通人如何借助AI实现弯道超车?

人工智能技术的高速发展&#xff0c;普通人如何借助AI实现弯道超车&#xff1f; 随着互联网信息传播的爆炸&#xff0c;人类科技文明的快速发展“人工智能”成为新的话题&#xff0c;科技的进步也让普通人觉得自己与社会脱节&#xff0c;找工作越来越难&#xff0c;创业越来越难…

Python使用Numba装饰器进行加速

Python使用Numba装饰器进行加速 前言前提条件相关介绍实验环境Numba装饰器进行加速未加速的代码输出结果 numba.jit加速的代码输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、Ope…

Aspose.OCR for .NET 2023Crack

Aspose.OCR for .NET 2023Crack 为.NET在图片上播放OCR使所有用户和程序员都可以从特定的图像片段中提取文本和相关的细节&#xff0c;如字体、设计以及书写位置。这一特定属性为OCR的性能及其在扫描遵循排列的记录时的功能提供了动力。OCR的库使用一条线甚至几条线来处理这些特…

什么是证书管理

在自带设备和物联网文化的推动下&#xff0c;数字化使连接到互联网的设备数量空前加速。在企业网络环境中&#xff0c;每个在线运行的设备都需要一个数字证书来证明其合法性和安全运行。这些数字证书&#xff08;通常称为 X.509 证书&#xff09;要么来自称为证书颁发机构 &…

长虹智能电视使用123

1、开机 在接通电源的情况下&#xff0c;长虹智能电视开机有两种方式。 方式1&#xff1a; 按电视右下角开机按钮 方式2&#xff1a; 按电视遥控器开机按钮 长虹智能电视开机后会进入其操作系统&#xff08;安卓&#xff09;。 屏幕左右双箭头图表&#xff0c;手指点击会…

力扣876:链表的中间结点

力扣876&#xff1a;链表的中间结点 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5]…

无线优化之RRM模板

一、简介 RRM即,Radio Resource Management,射频资源管理 WLAN技术是以射频信号(如2.4G/5G的无线电磁波)作为传输介质,无线电磁波在传输过程中因周围环境导致无线信号衰减,从而影响无线用户上网的服务质量。 RRM模板主要用于保持最优的频射资源状态,自动检查周围无线…

二十四、城市建成区提取结果制图——建成区出图

一、前言 其实制图这一系列文章主要是为了照顾初学者,因为很多初学者并不是特别熟悉GIS平台一些操作,可能对于初步的制图有一定了解,但是对于一些稍微看起来高级并且复杂一点的图如何制作?例如下面这种多景的制作,其实吧万变不离其宗,这种仅仅只是拼接多幅数据框在一起,…

关于css 推荐几个超好看渐变色!

1.多彩糖果渐变 background: linear-gradient(135deg, #ff00cc, #ffcc00, #00ffcc, #ff0066);这个渐变色使用了多个鲜艳的颜色&#xff0c;从紫红色 (#ff00cc) 渐变到橙色 (#ffcc00)&#xff0c;然后到青色 (#00ffcc)&#xff0c;最后到鲜艳的粉红色 (#ff0066)。它给人一种快乐…

为啥$p(w|D)=p(y|X,w)$?

为啥 p ( w ∣ D ) p ( y ∣ X , w ) p(w|D)p(y|X,w) p(w∣D)p(y∣X,w)&#xff1f; p ( w ∣ X , y ) p ( w ∣ D ) p(w|X,y)p(w|D) p(w∣X,y)p(w∣D), p ( w ∣ D ) p ( D , w ) / p ( D ) p(w|D)p(D,w)/p(D) p(w∣D)p(D,w)/p(D)为啥 p ( D ∣ w ) p ( y ∣ X , w ) p(D|…

kubernetes istio

目录 一、部署 二、部署示例应用 三、部署遥测组件 四、流量管理 五、熔断 官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ 一、部署 提前准备好文件 tar zxf 15t10-1.19.3-linux-amd64.tar.gz cd 15t10-1.19.3/ export PATH$PWD/bin:$PATHistioctl install …

强化学习 - DQN及进化过程(Double DQN,Dueling DQN)

1.DQN 1.1概念 DQN相对于Q-Learning进行了三处改进&#xff1a; 1.引入神经网络&#xff1a;如下图所示希望能从状态S中提取Q(s,a) 2.经验回放机制&#xff1a;连续动作空间采样时&#xff0c;前后数据具有强关联性&#xff0c;而神经网络训练时要求数据之间具有独立同分布特性…

数据结构:AVL树的旋转(高度平衡树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&#xff0c;他们…

CSS3渐变颜色

CSS3 渐变可以让你在两个或多个指定的颜色之间显示平稳的过渡。 CSS3渐变有两种类型&#xff1a;线性渐变&#xff08;Linear Gradients&#xff09;和径向渐变&#xff08;Radial Gradients&#xff09;。 线性渐变&#xff08;Linear Gradients&#xff09;&#xff1a; 线性…

MSVCP140_CODECVT_IDS.dll丢失怎么办?推荐三个解决方法帮你解决

MSVCP140_CODECVT_IDS.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它包含了一些运行时库文件。当您在运行某些程序时&#xff0c;可能会遇到“msvcp140_codecvt_ids.dll丢失”的错误提示。为了解决这个问题&#xff0c;您可以尝试以下三种方法&#x…