LUA语法复习总结

文章目录

    • 简记
    • 变量
    • 数据类型
    • 运算符
      • 算术运算符
      • 关系运算符
      • 逻辑运算符
      • 杂项运算符
    • 列表(表)
      • 表格操作
      • 表连接
      • 插入和删除
      • 排序表
    • 模块
    • 元表
      • __index 元方法
        • 实例
      • 总结
      • __newindex 元方法
        • 实例
        • 实例
      • 为表添加操作符
        • 实例
      • __call 元方法
        • 实例
      • __tostring 元方法
        • 实例

简记

  • lua下标从1开始
  • 迭代器pairs/ipairs
  • 函数是一等公民

变量

  • lua中变量是对值的引用

  • 默认全局变量

  • 局部变量添加关键字local

数据类型

nil用于将值与有一些数据或没有(无)数据区分开来。
boolean包括 true 和 false 作为值。 一般用于条件检查。
number表示实数(双精度浮点数)。
string表示字符数组。
function表示用 C 或 Lua 编写的方法。
userdata表示任意 C 数据。
thread代表独立的执行线程,用于实现协程。
table表示普通数组、符号表、集合、记录、图形、树等,实现关联数组。 它可以保存任何值(nil 除外)。

运算符

算术运算符

下表显示了 Lua 语言支持的所有算术运算符。 假设变量 A 持有 10 并且变量 B 持有 20 然后

运算符描述示例
+添加两个操作数A + B 将得到 30
-从第一个操作数中减去第二个操作数A - B 将得到 -10
*两个操作数相乘A * B 将得到 200
/分子除以分母B / A 将得到 2
%取模运算符和整数除法后的余数B % A 将得到 0
^指数运算符取指数A^2 将得到 100
-一元 - 运算符作为否定-A 将得到 -10

关系运算符

下表显示了 Lua 语言支持的所有关系运算符。 假设变量 A 持有 10 并且变量 B 持有 20 然后

运算符描述示例
==检查两个操作数的值是否相等,如果是则条件为真。(A == B) is not true.
~=检查两个操作数的值是否相等,如果值不相等则条件为真。(A ~= B) is true.
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) is not true.
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) is true.
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) is not true.
<=检查左操作数的值是否小于或等于右操作数的值,如果是的,则条件将变为true。(A <= B) is true.

逻辑运算符

下表显示了 Lua 语言支持的所有逻辑运算符。 假设变量 A 为真,变量 B 为假,则 −

运算符描述示例
and称为逻辑与运算符。 如果两个操作数都不为零,则条件为真。(A and B) is false.
or称为逻辑或运算符。 如果两个操作数中的任何一个非零,则条件变为真。(A or B) is true.
not称为逻辑非运算符。用于逆转其操作数的逻辑状态。 如果条件是 true,则逻辑非运算符结果会是 false。!(A and B) is true.

杂项运算符

Lua 语言支持的其他运算符包括 concatenationlength

运算符描述示例
连接两个字符串。a…b 其中 a 是"Hello",b 是"World",将返回"Hello World"。
#返回字符串或表格长度的一元运算符。#“Hello” 将返回 5

列表(表)

表是lua中唯一的数据结构

可以用数字或者字符串做key

--样本表初始化
mytable = {}

表格操作

有用于表格操作的内置函数,它们列在下表中。

序号方法 & 用途
1**table.concat (table [, sep [, i [, j]]])**根据给定的参数连接表中的字符串。 有关详细信息,请参见示例。
2**table.insert (table, [pos,] value)**在表中的指定位置插入一个值。
3**table.maxn (table)**返回最大的数字索引。
4**table.remove (table [, pos])**从表中删除值。
5**table.sort (table [, comp])**根据可选的比较器参数对表进行排序。

让我们看一下上述函数的一些示例。


表连接

我们可以使用 concat 函数来连接两个表,如下所示 −

fruits = {"banana","orange","apple"}-- returns concatenated string of table
print("Concatenated string ",table.concat(fruits))--concatenate with a character
print("Concatenated string ",table.concat(fruits,", "))--concatenate fruits based on index
print("Concatenated string ",table.concat(fruits,", ", 2,3))

当我们运行上述程序时,我们将得到以下输出 −

Concatenated string 	bananaorangeapple
Concatenated string 	banana, orange, apple
Concatenated string 	orange, apple

插入和删除

在表格中插入和删除项目是最常见的表格操作。 下面解释一下。

fruits = {"banana","orange","apple"}-- insert a fruit at the end
table.insert(fruits,"mango")
print("Fruit at index 4 is ",fruits[4])--insert fruit at index 2
table.insert(fruits,2,"grapes")
print("Fruit at index 2 is ",fruits[2])print("The maximum elements in table is",table.maxn(fruits))print("The last element is",fruits[5])table.remove(fruits)
print("The previous last element is",fruits[5])

当我们运行上述程序时,我们将得到以下输出。−

Fruit at index 4 is 	mango
Fruit at index 2 is 	grapes
The maximum elements in table is	5
The last element is	mango
The previous last element is	nil

排序表

我们经常需要按特定顺序对表格进行排序。 排序函数按字母顺序对表中的元素进行排序。 下面显示了一个示例。

fruits = {"banana","orange","apple","grapes"}for k,v in ipairs(fruits) doprint(k,v)
endtable.sort(fruits)
print("sorted table")for k,v in ipairs(fruits) doprint(k,v)
end

当我们运行上述程序时,我们将得到以下输出 −

1	banana
2	orange
3	apple
4	grapes
sorted table
1	apple
2	banana
3	grapes
4	orange

模块

require "<模块名>"

元表

  • setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
  • getmetatable(table): 返回对象的元表(metatable)。

以下实例演示了如何对指定的表设置元表:

mytable = {}              *-- 普通表*
mymetatable = {}            *-- 元表*
setmetatable(mytable,mymetatable)   *-- 把 mymetatable 设为 mytable 的元表*

以上代码也可以直接写成一行:

mytable = setmetatable({},{})

以下为返回对象元表:

getmetatable(mytable)                 -- 这会返回 mymetatable

__index 元方法

这是 metatable 最常用的键。

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。

__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。

实例
mytable = setmetatable({key1 = "value1"}, {__index = function(mytable, key)if key == "key2" thenreturn "metatablevalue"elsereturn nilendend
})print(mytable.key1,mytable.key2)

实例输出结果为:

value1    metatablevalue

实例解析:

  • mytable 表赋值为 {key1 = “value1”}

  • mytable 设置了元表,元方法为 __index。

  • 在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。

  • 在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。

  • 判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。

  • 元方法中查看是否传入 “key2” 键的参数(mytable.key2已设置),如果传入 “key2” 参数返回 “metatablevalue”,否则返回 mytable 对应的键值。

我们可以将以上代码简单写成:

mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)

总结

Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:

  • 1.在表中查找,如果找到,返回该元素,找不到则继续
  • 2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
  • 3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。

__newindex 元方法

__newindex 元方法用来对表更新,__index则用来对表访问 。

当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。

实例
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })print(mytable.key1)mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey)mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)

以上实例执行输出结果为:

value1
nil    新值2
新值1    nil

以上实例中表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.newkey = “新值2”),会调用元方法,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。

以下实例使用了 rawset 函数来更新表:

实例
mytable = setmetatable({key1 = "value1"}, {__newindex = **function**(mytable, key, value)rawset(mytable, key, "**\"**"..value.."**\"**")**end**
})mytable.key1 = "new value"
mytable.key2 = 4print(mytable.key1,mytable.key2)

以上实例执行输出结果为:

new value    "4"

为表添加操作符

以下实例演示了两表相加操作:

实例
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大键值函数 table_maxn,即返回表最大键值
function table_maxn(t)local mn = 0for k, v in pairs(t) doif mn < k thenmn = kendendreturn mn
end-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {__add = function(mytable, newtable)for i = 1, table_maxn(newtable) dotable.insert(mytable, table_maxn(mytable)+1,newtable[i])endreturn mytableend
})secondtable = {4,5,6}mytable = mytable + secondtablefor k,v in ipairs(mytable) do
print(k,v)
end

以上实例执行输出结果为:

1    1
2    2
3    3
4    4
5    5
6    6

add 键包含在元表中,并进行相加操作。 表中对应的操作列表如下:(**注意:******是两个下划线)

模式描述
__add对应的运算符 ‘+’.
__sub对应的运算符 ‘-’.
__mul对应的运算符 ‘*’.
__div对应的运算符 ‘/’.
__mod对应的运算符 ‘%’.
__unm对应的运算符 ‘-’.
__concat对应的运算符 ‘…’.
__eq对应的运算符 ‘==’.
__lt对应的运算符 ‘<’.
__le对应的运算符 ‘<=’.

__call 元方法

__call 元方法在 Lua 调用一个值时调用。以下实例演示了计算表中元素的和:

实例
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
-- 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
function table_maxn(t)local mn = 0for k, v in pairs(t) doif mn < k thenmn = kendendreturn mn
end-- 定义元方法__call
mytable = setmetatable({10}, {__call = function(mytable, newtable)sum = 0for i = 1, table_maxn(mytable) dosum = sum + mytable[i]endfor i = 1, table_maxn(newtable) dosum = sum + newtable[i]endreturn sumend
})
newtable = {10,20,30}
print(mytable(newtable))

以上实例执行输出结果为:

70

__tostring 元方法

__tostring 元方法用于修改表的输出行为。以下实例我们自定义了表的输出内容:

实例
mytable = setmetatable({ 10, 20, 30 }, {__tostring = function(mytable)sum = 0for k, v in pairs(mytable) dosum = sum + vendreturn "表所有元素的和为 " .. sumend
})
print(mytable)

以上实例执行输出结果为:

表所有元素的和为 60

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

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

相关文章

Linux学习笔记(一)Linux基本指令

文章目录 前言目录常见命令1. pwd 打印当前所在路径2. cd 改变路径、切换路径3. 家目录 回到顶级目录4. 当前路径和上一路径5. 上一次路径6. 绝对路径和相对路径7. ls 列出目录内容8. mkdir 创建目录9. rmdir 删除目录10. touch 创建文件11. mv 修改文件目录、移动路径12. cp 复…

一口吃掉Linux基础操作

一般在windows上面想要操作Linux系统就需要装软件搞一个虚拟机&#xff0c;我用的是Ubuntu22&#xff0c;就是Linux的发行版.安装Ubuntu的过程比较复杂&#xff0c;最重要的一点是安装时要断网&#xff0c;否则会很慢。 Ubuntu 配置指南 — 地震“学”科研入门教程 先介绍一个…

光伏便携式EL检测仪是什么?—科技助农

光伏便携式EL监测仪是一种专门用于检测光伏电池组件性能的高效、实用的设备。它利用电致发光&#xff08;Electroluminescence&#xff0c;EL&#xff09;原理&#xff0c;通过检测光伏板在受到光照后产生的电流所激发出的光线&#xff0c;来评估光伏板的性能。这种设备通常具有…

C++初阶:2_类与对象(上)

类与对象(上) 一.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之…

【DAY10 软考中级备考笔记】数据结构 图

数据结构 图 3月11日 – 天气&#xff1a;晴 晚上无线网络突然不能用了&#xff0c;花费好久弄这个&#xff0c;耽误了一些时间 1. 图的定义 这里需要注意完全图的定义&#xff0c;以及完全图的边数 这里需要注意连通图和连通分量的概念。 2. 图的存储结构 图有两种存储结构&a…

ms office学习记录:Word㈣ 布局设计引用选项卡 对应配套作业㈤

⒈页面设置 &#xff08;主要考查页面设置对话框&#xff09; 页码范围&#xff1a;对称页边距/拼页&#xff08;在一张纸上从左往右打印两页内容&#xff09; 行号可在两个位置设置 若找不到规定纸张大小&#xff0c;则文件→打印→更换驱动打印机 ⒉页面背景 页面颜色&a…

Java操作Sql语句 出现迭代死循环 (Bug排查)

目录 1. 问题所示2. 原理分析3. 解决方法4. 彩蛋1. 问题所示 Java执行Sql语句来查询一些数据的时候 虽说数据量很大,但是查询过程中一直迭代查询 截图如下所示: 2. 原理分析 至于迭代死循环,可能是不满足的条件也进入查询(本身我的数据量就很大) 主要可能引起的两个原…

python使用词袋模型将句子向量化,使用KNN进行文本分类

要使用词袋模型将句子向量化&#xff0c;并使用KNN进行分类&#xff0c;你可以使用Python的sklearn库。以下是一个简单的例子&#xff1a; 加载数据集文本预处理&#xff08;如分词、去除停用词等&#xff09;使用词袋模型进行向量化使用KNN进行训练和分类 首先&#xff0c;确…

RockChip Android13 修改U盘挂载目录

环境:Android13 安卓默认U盘挂载目录为设备UUID,如下所示: /dev/block/vold/public:8,0 on /mnt/media_rw/1E46712C467105B5 type fuseblk (rw,dirsync,nosuid,nodev,noatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096) /dev/fuse on /mnt/user/…

自动化运维技术与工具整合

以下这些自动化运维技术与工具覆盖了软件开发和运维的多个关键领域&#xff1a;自动化配置管理、容器化、容器编排、监控与可视化、自动化构建与部署、基础设施及应用配置管理、性能监控&#xff0c;以及日志分析。Ansible 简介: Ansible 是一个开源的自动化平台&#xff0c;用…

C++/CLI学习笔记7(快速打通c++与c#相互调用的桥梁)

3.11 操作符和表达式 操作符说明=赋值操作符 a=b=0;+,-,*,/,%,+=,-=,*=,/=,%=,++,--算术操作符 int a,b,c; a=b=c-0; b=++a; c=b-a+b*a; ... >,>=,<,<=,==,!=关系操作符 a > b // a大于b就返回true a >= b // a大于或等于b就返回true a < b //a小于b就返…

C#/WPF 清理任务栏托盘图标缓存

在我们开发Windows客户端程序时&#xff0c;往往会出现程序退出后&#xff0c;任务还保留之前程序的缓存图标。每打开关闭一次程序&#xff0c;图标会一直增加&#xff0c;导致托盘存放大量缓存图标。为了解决这个问题&#xff0c;我们可以通过下面的程序清理任务栏托盘图标缓存…

【C++函数速查】lower_bound和upper_bound使用方法详细解读

文章目录 1&#xff09;概述2&#xff09;函数使用3&#xff09;案例代码 1&#xff09;概述 l o w e r _ b o u n d ( ) lower\_bound() lower_bound() 和 u p p e r _ b o u n d ( ) upper\_bound() upper_bound() 都是基于二分查找在一个排好序的数组或容器&#xff08;如 …

【UE5】非持枪趴姿移动混合空间

项目资源文末百度网盘自取 创建角色在非持枪状态趴姿移动的动画混合空间 在BlendSpace文件夹中单击右键选择 动画(Animation) 中的混合空间(Blend Space) 选择SK_Female_Skeleton 命名为BS_NormaProne 打开BS_NormaProne 水平轴表示角色的方向&#xff0c;命名为Directi…

C 练习实例76-求倒数和

题目&#xff1a;编写一个函数&#xff0c;输入n为偶数时&#xff0c;调用函数求1/21/4...1/n,当输入n为奇数时&#xff0c;调用函数1/11/3...1/n(利用指针函数)。 代码 #include <stdio.h> void fun1(int n,double *ret) {for(int i1;i<n;i2)*ret1.0/i; } void fun…

SecureCRT出现乱码的解决方法

SecureCRT是一个商业终端连接工具&#xff0c;它支持多种自定义设置。默认设置下&#xff0c;通过SecureCRT连接SSH服务器可能出现中文乱码的情况。这是由于SecureCRT字符编码与服务器的字符编码不一致造成的。 当然解决这个问题也很简单&#xff0c;将SecureCRT字符编码设置成…

ACM记忆化DFS与基于优先队列的BFS

基本概念--记忆化DFS 使用数组保存已经算出来的值&#xff0c;在后续的计算中减少大量的重复计算&#xff0c;提高效率。&#xff08;用于dp不方便&#xff0c;但是搜索方便的情况&#xff0c;可以提升效率。&#xff09; eg. 记忆化dfs求解斐波那契数列 int dfs(int n) {if…

idea Springboot 数码商城系统LayUI框架开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 数码商城系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整…

<网络安全>《67 微课堂<第8课 常见网络安全厂商简介>》

奇安信科技集团股份有限公司 简称&#xff1a;奇安信 英文名称&#xff1a;QiAnXin Technology Group Co., Ltd. 成立时间&#xff1a;2014年 总部位置&#xff1a;中国北京 主营业务&#xff1a;提供企业级网络安全产品、安全解决方案和安全运营服务&#xff0c;专注于网络空…

SpringMVC请求、响应和拦截器的使用

SpringMVC请求 RequestMapping注解 RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系 RequestMapping注解可以作用在方法和类上 1. 作用在类上&#xff1a;第一级的访问目录 2. 作用在方法上&#xff1a;第二级的访问目录 3. 细节&#xff1a;路径可以不编写…