Lua学习笔记(记录与C#的异同点)

基本语法方面:

注释:
单行 --“需要注释的内容”
多行 --[[“需要注释的内容”–]]

代码格式:
不需要使用“;”符号做结尾

变量:

Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的默认变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
变量的默认值为nil。

数据类型

nil:等价于C#中的null,在bool判断是为false
boolean:布尔判断,只有true和false,需要注意的是lua中只有nil为false,0也是true
number:表示双精度类型的实浮点数
string:字符串由一对双引号或单引号来表示
function:由 C 或 Lua 编写的函数
userdata:表示任意存储在变量中的C数据结构
thread:表示执行的独立线路,用于执行协同程序
table:Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
function、table会在下文详细介绍。

函数

格式:
function functionName(parameter)
body
// return value
end
function是关键字,functionName是自定义的函数名,body是函数体,是自定义想完成的内容,实现完之后以end结尾(固定格式)。
return value1,value2函数的返回值。
注意点:lua中函数不需要设置返回值类型不需要设置参数类型,如果需要返回参数,直接return参数即可,并且可以一次返回多个参数,中间用“,”隔开。
Lua中的函数支持可变参数,用“”表示,即可以传入一个参数也可以传入多个参数。
实例:
Lua学习笔记(记录与C#的异同点)

Lua循环

使用方法与C#一样,Lua提供了三种循环类型与两个循环控制语句。
while循环
使用格式:while (true) do
body
end
for循环
使用格式:for i=1,10,1 do
print(i)
end
从1开始,<=10时,输出i,每次自增1

repeat unitil循环和C#do while一样,先执行一次后判断,满足条件退出
使用格式:
i = 1
repeat
i = i+1
until (i>10)
print (i)–输出为11

break语句退出当前循环或者语句,并开始执行脚本紧接着的语句
goto语句将程序的控制点转移到一个标签处

运算符

算数运算符
与C#一致,但是要注意一下。Lua中的number是双精度类型,即 1对0.6取余,余数是0.4,两个整数之间相除,如果可以获得小数会保留。
Lua学习笔记(记录与C#的异同点)
关系运算符
与C#基本一致,除了不等于的符号是“~=

逻辑运算符
判断条件与C#一致,但是符号不同,分别为 and or not

其他运算符
”连接两个字符串,string变量的时候介绍过
#”一元运算符,返回字符串或者表的长度(按字节长度运算,汉字为两个字节)

Lua迭代器

迭代器的功能就是对一堆数据进行遍历。
Lua中提供了两种迭代器,pairsipairs
区别,pairs会遍历所有数据,ipairs遍历数据时遇到nil停止。
例如现在有一个表,table = {1,2,3,nil,5,6}
用pairs遍历输出会显示 1,2,3,nil,5,6
用ipairs遍历输出会显示1,2,3

泛型for迭代器
使用格式如下
Lua学习笔记(记录与C#的异同点)
test为迭代函数,state是状态常量,只会赋值一次,control为控制变量,会多次赋值。个人觉得格式用起来比较麻烦,不太好用。

Lua模块与包

类似C#中using name,引用命名空间。
Lua学习笔记(记录与C#的异同点)
在另一个lua文件中即可调用。
Lua学习笔记(记录与C#的异同点)
可以用一个变量接收包,方便调用。
Lua学习笔记(记录与C#的异同点)
当有一些方法或者数据不想被外部引用被调用,可以用local设置为局部变量,这样在外部文件就无法访问

Lua中的表

Lua中的表初步可以理解为C#中的字典。
格式: table = {key1 = “value1”}
表示引用类型,即将表赋值给另一个变量,可以通过当前的变量或者新变量对表进行修改,修改的都是同一个表,但是删除其中一个,另一个变量依旧可以访问表,只有将表的所有引用都删除,才能删除表
如果将表中的某一个键的值设为nil,后续的键并不会向前移。
例如 mytable = {1,2,3,4,5,6}
mytable[2] = nil
此时 mytable的内容是{1,nil,3,4,5,6}
如果想实现和unity中List移除某一个元素的效果
需要使用 table.remove(mytable,2)
此时mytable内容变为{1,3,4,5,6}

元表

lua中的元表初步可以理解为是对表的功能拓展。例如,原来不能实现表与表值间的相加,table1+table2,但是有了元表之后则可以。
格式:
mytable = {} – 普通表
mymetatable = {} – 元表
setmetatable(mytable,mymetatable) – 把 mymetatable 设为 mytable 的元表
setmetatable有返回值,返回的是tab,可以用一个变量值接收。如:
newtable = setmetatable(mytable,mymetatable)
原方法 lua中有几个固定的原方法,相当于C#中的API,如果访问表中一个不存在的键,就会调用相关的原方法。
__index
1、如果__index包含一个表格,Lua会在表格中查找相应的键。如下:
Lua学习笔记(记录与C#的异同点)
访问不存在的值会调用__index,但是index的other表存在foo,所以第一个值返回3,other表中不存在bar,所以第二值返回nil

2、如果__index包含一个函数,Lua就会调用那个函数,table和会作为参数传递给函数。相当于调用了一个匿名函数。
Lua学习笔记(记录与C#的异同点)

__newindex
__newindex 元方法用来对表更新。
当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
Lua学习笔记(记录与C#的异同点)

为表添加操作符
Lua学习笔记(记录与C#的异同点)
加号的参考案例:

– 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用
– 自定义计算表中最大键值函数 table_maxn,即计算表的元素个数
Lua学习笔记(记录与C#的异同点)

另外还有**__call** 和 __totring
__call可以理解为将表当做函数用,可以实现table(参数)
Lua学习笔记(记录与C#的异同点)
__tostring
可以理解为表可以实现print(table),不再是显示内存地址,而是显示里面的实际内容。
Lua学习笔记(记录与C#的异同点)

协同程序

协程并不是多线程,仍然只是一个线程。
Lua中的协程与unity中的协程用法有差别,虽然都是协程。
Unity中的协程是为了实现多线程效果而用,例如异步下载数据加载等。而Lua中的协程更像是某一个任务做到某一步挂起,然后去做另一件事,另一件事做完再回来做当前的任务。
基本语法:
Lua学习笔记(记录与C#的异同点)
需要注意的是coroutine.resume()是有返回值的,首先会返回执行状态,然后如果协程有返回值的话,会依次返回值。另外一个协程只能执行一次,执行完成之后不能再执行,如下:
Lua学习笔记(记录与C#的异同点)
参考案例可以见菜鸟教程,代码较多,此处就不浪费位置了。
菜鸟教程Lua_协同

I/O文件、错误处理、调试Debug、垃圾回收

Lua中的IO和C#一样,调用相关API就行,在初学阶段不是特别重要的知识,需要用到的时候学习相关的API调用就行。具体参考菜鸟教程。
菜鸟教程Lua_I/O
Lua错误分为语法错误运行错误
菜鸟教程Lua_错误处理
菜鸟教程Lua_垃圾回收

Lua的面向对象

Lua中是没有类这个概念的,但是我们可以根据表与元表模拟类。先从简单的开始,一步一步解决模拟类遇到的方法。
Lua学习笔记(记录与C#的异同点)
Lua中的table是引用类型,只有当引用的对象的索引全部设置为nil的时候才会回收内存,图上是 a和b都为nil时才会回收,但是遇到了一个问题,play方法中调用了a的name,a设置为nil后,b调用play就会报错。此时可以改成如下代码:
Lua学习笔记(记录与C#的异同点)
函数中添加一个参数,根据传进来的参数获取相对应参数的值,然后调用方法,但是这样比较麻烦,可以进一步优化。
Lua学习笔记(记录与C#的异同点)
将“.”符号改为冒号“:”这里的self代表 调用这个方法table的本身。接下来,我们加入元表来实现类的实现与继承。
Lua学习笔记(记录与C#的异同点)
new方法:可以传入一个表,如果不传,那么即空表。然后将基类a作为新表b的元表,如果新表b没有找到数据,则去表a中寻找,这就实现了类的继承。
调用b的时候,b会先检查自身是否有,如果没有,就去a中寻找,实现lua的类继承。

至此:Lua中常用的比较重要的知识点就总结完啦。