Lua

1.4k 词

日常

粉家干捞螺蛳粉

入门了一个很可爱的脚本语言,撸啊!

Lua脚本号称是性能最高的脚本,用在许多需要性能的地方,比如游戏脚本,nginx等。源码解释器不到200K,能够和C语言友好互动。

变量

变量在使用前,必须在代码中声明来创建该变量。 编译程序执行代码前需要知道如何给语句变量开辟存储区来存储变量。

Lua变量分为: 全局变量, 局部变量, 表中域。 Lua中的变量全部是全局变量,哪怕是语句块或者函数里,除非用local关键字显示声明为局部变量。局部变量的作用域从声明位置开始到语句块结束。

变量的默认值是nil

赋值

Lua可以对多个值同时赋值, 变量列表和值列表用逗号分割,依次赋值。 -> 交换值

左右个数不一致时会采取规则:a.变量个数>值对个数 -> 按变量个数补nil b.变量个数<值个数 -> 多余值被忽略

尽可能使用局部变量可以避免明明冲突,同时访问局部变量对速度比全局变量更快。

索引

对table的访问可以用[], 也可以用dot

Lua函数

函数是对语句和表达式进行抽象对主要方法。1.完成指定任务。2.计算并返回值。

函数定义格式如下

1
2
3
4
5
6
optional_function_scope *function* function_name(arg1, arg2, arg3...)
function_body
*return* result_params_comma_separated
end
optional_function_scope: 该参数用来决定函数是全局函数还是局部函数,未设置则默认为全局函数,否则用(local)

Lua中,可以将函数作为参数传递给函数(callback

可变参数

Lua接受可变数目的参数, 使用和C类似的方法,在列表中用three dots(…)表示函数有可变参数。Lua将参数放在一个叫arg的表中,#arg表示传入参数的个数。

运算符

要注意的是 不等于 -> ~=

逻辑运算符三个 and or not

特殊运算符两个, 1, double dots(..)连接两个字符串 2, # -> 一元运算符,用来返回字符串或者表长度

Lua迭代器

Lua 中迭代器是一种支持指针类型的结构

范型for迭代器
for范型保存三个值 -> 迭代函数, 状态常量, 控制变量

执行过程:

  • 初始化计算in后表达式的值, 表达式应该返回范型for需要的三个值,与多赋值一样,若表达式返回结果个数不足三个自动补nil,多出的忽略
  • 将状态常量和控制变量作为参数调用迭代函数
  • 将迭代函数返沪指赋给变量列表
  • 返回的第一个值为nil结束循环,否则执行循环体
  • 返回第二步

Lua 迭代器分为 无状态的和多状态的

无状态迭代器
不保留任何状态的迭代器, 在循环中可以利用无状态迭代器避免创建闭包花费额外代价。

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态迭代器只利用这两个值可以获得的下一个元素。

这种无状态迭代器的典型例子就是ipairs, 他遍历数组的每一个元素

多状态迭代器

很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到table内,将table作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在table内,所以迭代函数通常不需要第二个参数

tips

  • ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key