Lua学习笔记

最近在研究一些使用Lua脚本的Unity项目, Lua主要用来实现频繁变更的业务逻辑,方便和美术资源一起进行在线热更新。一直以来主要从事游戏客户端的开发,实践应用Lua的情景比较少(相对于服务器的C++&Lua的技术栈),所以在初步的学习了解阶段做一些笔记。

语法

判断操作符

与/或:and表示与,or表示或。

~=/==:数值和字符串类型比较时是值比较(其他数据类型比较的是引用)。

没有三目运算符,可以采用(a and b) or c,不过由于逻辑判断只有在false和nil时为假,其余均为真,所以最好不这样写,理解起来有些费劲。

非全局方法访问操作符

obj. func 对象方法,类似其他语言的静态方法,传递的参数个数为显式的个数。
obj: func 对象成员方法,类似其他语言的成员方法,省去了方法的self参数声明和方法的显式调用(对象成员的方法定义 function obj:func() end,否则造成参数匹配错位)。

其他操作符

.. 字符串的连接符,+左右作用对象会被自动转义成数值类型进行相加运算。

# 长度运算符,可计算字符串(字符数组)和table的长度(仅统计所有下标为整数的元素的个数)。

table

既是数组又是hashmap。

遍历方式

  • pairs 键值对遍历,可理解为其他的语言的foreach
  • *ipairs:连续的整形键值,且value非空的table遍历。完全是为了体现语义精确的精神,不然就用pairs好了
  • for i = 1, len, do 顺序
  • for i = len, 1, -1 do 倒序

ps1:t[1] 和 t[“1”]表示不同的记录,即键值可以为不同的类型,非泛型。

ps2:索引下标从1开始,而不是0。这让我想起初学程序时对0索引值的不解,1不是更贴近自然表达么,不过现在反而觉得1作为下标有点特立独行。

metatable 元表与面向对象

metatable也是table

控制流

有break,没有continue。
return 必须紧接着end关键字,比如do return end,或者if true then return end。

支持可变参数

…为参数列表。

,2,3,4)

支持多值返回

local
变量声明除非有作为全局的必要,否则尽可能的使用local,运算效率更高。

优化

JIT即时编译技术,相当于给解释器增加缓存功能,对于热点代码做了编译缓存。

参考