lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
一、lua变量【 全局变量和局部变量和表中的域】
Lua 变量有三种类型:全局变量和局部变量和表中的域。
全局变量:默认情况下,Lua中所有的变量都是全局变量。
局部变量:使用
local显式声明在函数内的变量,以及函数的参数,都是局部变量。在函数外即使用local去声明,它的作用域也是当前的整个文件,这相当于一个全局变量。表中的域:变量的默认值均为
nil。Lua语言不区分未初始化变量和被赋值为
nil的变量,因此全局变量无须声明即可使用。
1、全局变量
全局变量,不需要声明,只需要将一个值赋予一个全局变量即可创建了。
b=10 -- 这个b就是一个全局变量了
print(b)
- 通常没必要删除一个全局变量,如果一个变量生存周期较为短,使用局部变量即可。不过,如果真的想删除全局变量的话,只需将它赋值为nil。
b=nil -- 这个全局变量b就被删除了
print(b)
2、局部变量-使用local 声明
Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
■ 建议:在Lua中,应尽可能使用局部变量,好处:
- 避免命名冲突
- 访问局部变量的速度比全局变量更快
3、lua表中的域
a = {}
a[10] = 1
for i=1,15,1 do
print(a[i])
end
- 结果:

二、lua数据类型、if判断条件
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
1、Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
| 数据类型 | 描述 |
|---|---|
nil |
空值,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
| boolean | 布尔类型 |
| number | 数值类型,相当于C语言的double |
| string | 字符串类型,由一对双引号或单引号来表示 |
| function | 函数类型,由 C 或 Lua 编写的函数 |
table |
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的字面量是用{} 表示。 {},表示创建一个空表。 |
| thread | 线程类型,表示执行的独立线路,用于执行协同程序 |
| userdata | 表示任意存储在变量中的C数据结构 |
2、type(变量名)
- 作用:获取该变量的类型
3、lua 的if 判断条件是理解为是否有效
▷什么时候会【无效】错误失败---为nil和false的时候
- nil 表示空值、无效值
▷其他情况为数字、字符串、true、表(甚至是空表也是正确的),判断条件都是【有效】正确成功的!
三、lua数据结构-table
0、table的字面量:{},创建的空表,内部的域默认值是nil。
- 表用大括号{}来构造,可以是多维的 {{}}。
1、lua中的表,其实是一个"关联数组",关联数组是一种具有特殊索引的数组,数组的索引可以是数组、字符串、表等[除了nil]。
- 表中的元素是键值对形式。key 也就是数组的索引。表的key是唯一的。表是可以自定义键名。
2、table 是没有固定大小的,可以添加任意数量的元素到数组中。
3、table 是lua中最主要的数据结构机制,也是唯一的数据结构。用它可以实现数组,哈希表、集合、字典等等。还可以通过table 表示对象、包、模块。
其实lua 中的table 概念,相当于java中的对象的概念。万物皆是对象。
4、表中元素的删除,有两种方式:直接设置为nil或调用remove方法删除
- 两种删除方式的区别:直接把元素赋值为nil,会留下空位,不影响其他元素。而用remove函数去删除,会把后面的元素往前移,补位。
5、表中元素有多少个,可以使用#获取
6、表中的索引是从1开始的
tb={'干饭', '吃饭', '恰饭'}
- 实际上,tb如下:
-- tb的情况如下:
-- 地址table(c917ad2)
{
[1] = '干饭',
[2] = '吃饭',
[3] = '恰饭',
}
7、表有自定义键的时候:
-- 表中只写了值value作为元素
tb={'干饭', '吃饭', '恰饭', s='溜达'}
- 实际上,表是有默认分配键key的,默认分配的键是从数字1开始的,tb表中的分配如下:
-- tb的情况如下:
-- 地址table(c917ad3)
{
[1] = '干饭',
[2] = '吃饭',
[3] = '恰饭',
['s'] = '溜达',--细节:s会被带上引号
}
细节:要通过自定义的s键获取到值,s是要加上引号的。

对于自定义的键有一个语法糖,中括号可以使用点代替

表中默认分配的键和自定义键的执行顺序是:默认的先执行,然后再是自定义的键
-- 表中只写了值value作为元素
tb={'干饭',a='溜达',b='哈哈哈', _='饿了么','吃饭', '恰饭'}
- 实际上,tb表中的分配如下:程序分配键的时候,会先跳过自定义键,再接着分配。
-- tb的情况如下:
-- 地址table(c917ad3)
{
[1] = '干饭',
[2] = '吃饭',
[3] = '恰饭',
['a'] = '溜达',
['b'] = '哈哈哈',
['_'] = '饿了么',
}
- 结果:

8、table 提供的增删元素的方法 table.insert 和 table.remove
table.insert(表名,要增加的键位,要增加的值) 直接再最后的位置增加元素:table.insert(表名,要增加的值)
table.remove(表名,要删除的键位)
四、lua 函数(形参-实参数数量不匹配、多重返回值、不定长参数、方法的冒号和点-self隐式参数)
0、lua 程序是严格从上到下的顺序执行代码的, 函数的声明必须在写函数调用前面。

在lua中,函数是作为第一类型,
函数是可以存在在变量中,也可以通过参数传递给其他函数,还可以作为其他函数的返回值,还可以作为table表中的键
1、函数定义的方式
-- 方式1:
function 函数名(参数列表)
函数内容
end
-- 方式2:
函数名=function(参数列表)
函数内容
end
2、lua 函数
① 函数是可以存在在变量中【匿名函数】
a = function(x, y)
return x * y
end
b = a
print(b(2,3))
结果:
6
在table中也可以存在function函数
tab = {
test=function()
print("Hello World!")
end
}
tab.test()
- 结果:
Hello World!
3、形参-实参数数量不匹配
- 传入的实参数量 > 定义的形参数量:多传入的参数,直接被忽略了
- 传入的实参数量 < 定义的形参数量:缺少的参数,使用nil替补

4、多重返回值
- 举例1:

- 举例2:

- 小细节:多个具有多重返回值的函数连续调用[使用,间隔],只有最后一个函数被展开,即最后一个函数才有资格返回多个值,其他函数都默认返回第一个值

5、不定长参数
- 和java 一样,不定长参数使用...表示,并且作为函数的最后一个参数。
- 用 select 函数来访问变长参数了
- select('#', …) 返回可变参数的长度。
- select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。

6、方法的冒号和点-self隐式参数
▷ Lua 定义或调用方法时的语法糖-冒号,表示参数self
这个语法糖是用冒号,表示self,相当于java中的this
■ 举例1:
--定义
Account = { balance = 0 }
--withdraw 方法有两个参数,一个self【相当于java中的this】是指向当前table的Account
function Account.withdraw(self, v)
self.balance = self.balance - v
end
--等价写法:
function Account:withdraw(v) --通过冒号,表示定义了第一个参数是self
self.balance = self.balance - v
end
--调用
Account.withdraw(self, 100)
--等价写法
Account:withdraw(100)
■ 举例2:
-- 在table的键值对的value---是function的时候,方法的参数是self,并且还将self 参数传递给function方法体的另外一个方法
-- {} 在lua中表示table
tbWnd.tbOnClick = {
btnOk = function(self)
self:onClickOK() -- 相当于onClickOK(self)
end,
}
7、函数嵌套调用,并且作为参数的那个函数,它是需要有参数传入
① 通过将参数存储到table中,table又绑定上的函数,该函数就可以通过self.key 拿到参数
② 然后外层的函数(func,table)
local tbTable = {}
tbTable.key1 = 1
function tbTable:func1()--这样写,隐式参数是self
print(self.key1)
end
-- 函数嵌套调用
function func2(func,tbSelf)
func(tbself)
end
-- 执行
func(tbTable.func1)
五、lua 函数常见写法
1、直接构建
function func(...)
print(...)
end
-- 调用函数
func(123)
2、表构建,key存储函数(1)
local tbTable = {}
function tbTable.func1(...)
print(...)
end
function tbTable.func2(...)
print(...)
end
-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)
3、表构建,key存储函数(2)
local tbTable = {}
tbTable.func1 = function(...)
print(...)
end
tbTable.func2 = function(...)
print(...)
end
-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)
4、表构建,key存储函数(3)
local tbTable = {
func1 = function(...)
print(...)
end,
func2 = function(...)
print(...)
end
}
-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)
六、函数嵌套|闭包
1、local 特点:
局部变量:使用local 显式声明在函数内的变量,以及函数的参数,都是局部变量。
在函数外即使用local去声明,它的作用域也是当前的整个文件,这相当于一个全局变量。
2、函数嵌套|闭包
(1) 特点:函数的调用是用() 表示,有多少层,函数真正调用就需要多少个()
(2) 举例子:
- 举例子1:
local f = function(n)
return function(x)
return x+n
end
end
print(f(1)(2)) -- 函数嵌套,每一层都相当于()
a = f(1)
print(a(10))
结果:
3
11
- 举例子2:local 在函数外相当于java的全局变量【独立的作用域强调的就是这个在函数外面的local 变量】
local p = 1
local f = function()
local v = 0 -- local 在[下面的]函数外面相当于java的全局变量
return function()
v = v + p
print(v)
end
end
a,b = f(), f()
a(); b();
p = 2
a(); b();
结果:
1
1
3
3
local 在函数外相当于java的全局变量【独立的作用域】
class A{
private int v; -- 全局变量
public void add(){}
}
- 举例子3:
local f = function()
return {
add = function(a,b)
return a + b
end,
sub = function(a,b)
return a - b
end,
}
end
v = f()
print(v.add(1,2))
print(v.sub(2,1))
结果:
3
1
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】的更多相关文章
- python基础知识 变量 数据类型 if判断
cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...
- Python学习笔记----数据类型 运算符 循环 条件判断
1. Python安装 在官网www.python.org下载安装程序,可以支持的操作系统linux,windows,mac. Python版本:2.x和3.x,分别有x86和x64. 在Window ...
- ThinkPHP3.2中if判断条件是两个变量
<select name="typeId"> <foreach name="typeInfo" item="v"> ...
- 02.Lua的数据类型
简单认识Lua 百度了一下(偷哈懒就不自己写了) Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janei ...
- JAVA 变量 数据类型 运算符 知识小结
---------------------------------------------------> JAVA 变量 数据类型 运算符 知识小结 <------------------ ...
- 身份证运算符 is 和 is not(检查两个数据在内存当中是否是同一个值) | 逻辑运算符 and or not | 数据类型的判断 isinstance
# ###身份证运算符 is 和 is not(检查两个数据在内存当中是否是同一个值) var1 = 6 var2 = 6 print(id(var1),id(var2)) var1 = " ...
- lua的数据类型
Lua 是动态(弱)类型的语言,它有一下几种数据结构: nil(空) nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值: print ...
- js一些if语句判断条件为fasle的情况
js一些if语句判断条件为fasle的情况 之前有写一个if判断条件产生的bug,当时写逻辑处理数据是在后台给接口之前,所以自己拟定了字段值为number类型的0或者1来进行判断,最后接口出来的时候是 ...
- .Net程序员之Python基础教程学习----判断条件与循环[Fourth Day]
今天学习Python的判断条件与循环操作. 一. 布尔变量: 在学习判断条件之前必须的了解bool变量,在Python中bool变量与C语言比较类似,与.net差别比较大,其中下面集中情况需要 ...
- MyBatis 判断条件为等于的问题
在用MyBatis操作数据库的时候相信很多人都用到,当在判断null, 大于,大于等于,小于,小于等于,不等于时估计很多都用到,比较容易实现了,这里就省略了,但唯独判断条件为等于时估计蛮多人遇到坑了, ...
随机推荐
- c#和JS数据加密(转)
前台提交按纽 后以赋值后台取值 Base64编解码 C# /* 编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码. 它将需要编码的数据拆分成字节数组. ...
- springboot后端接收不到前端传来的表单值
为啥接收不到 因为传来的字段值太大了,springboot默认启动依赖tomcat,tomcat默认接收表单值最大为2MB,将server.tomcat.max-http-form-post-size ...
- WordPress标题分隔符”-“被转义为“–”怎么办?
按照百度搜索资源平台<百度搜索网页标题规范:让标题回归标题本身>百度官方文档参考,如果WordPress标题里出现不规范"– 2.停止wptexturize转义任何字符 add_ ...
- Python:合并两个列表成为一个list
如何合并两个列表,今天就来探讨一下: 方法一:最笨的方法实现 list1=[1,2,3]list2=[4,5,6]new_list=[]for item in list1: new_list.appe ...
- Nacos的微服务与本地测试的问题
前提条件: 这里是微服务上的yml的配置: uri: base-svc-authcenter: 192.168.1.121:28002 base-svc-file: 192.168.1.121:280 ...
- linux环境下部署mysql环境
一.部署步骤 1.将安装包上传到Linux服务器上(目录随意),然后解压缩 2.进入到解压后的目录下,分别执行以下命令安装四个包(严格按照顺序执行) rpm -ivh mysql-community- ...
- Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口
环境安装: (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4 上一篇相关随笔: Go语言:利用 TDD 测试驱动开发帮 ...
- Cesium官方教程——Fabric
1.简介 Fabric 是Cesium中定义的描述材质Material的JSON 结构体.Material代表了一个物体的外观. 材质Material可以是比较简单的,比如直接将一张图片赋予表面,或者 ...
- protobuf 详解
protobuf protobuf概述 protobuf简介 Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式, ...
- SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
SpringBoot 在Windows运行时,有个黑窗体,容易被不小心选中或关闭,或者服务器重启后,不能自动运行,注册为 Windows Service服务 可实现 SpringBoot 项目在Win ...