很多细节的小点为了防止自己遗忘,也方便以后查询,顺带回顾一下,分tips记录在这里。较为常识的Lua语法在这里就不在赘述了。
- Lua返回值可以是多个,但是在一些特定情况下只有一个。如用小括号强制返回一个,函数返回值在赋值语句中不是最后一个:
x,y = foo2(), 20
-- x='a', y=20 foo2返回两个值,但是此时只能返回一个
- Lua 中类似 return g(...)这种格式的调用是尾调用。但是 g 和 g 的参数都可以是复杂表达式,因为 Lua 会在调用之前计算表达式的值。例如下面的调用是尾调用: return x[i].foo(x[j] + a*b, i + j)
- 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。说白了目前的迭代器就是利用闭包的upvalue来保存值,实现循环调用。
-
for <var-list> in <exp-list> do <body> end
<var-list>是一个或多个以逗号分割的变量名列表,<exp-list>是一个或多个以逗号分割的表达式列表,通常情况下 exp-list 只有一个值:迭代工厂的调用。
首先,初始化,计算 in 后面表达式的值,表达式应该返回范性 for 需要的三个值:迭代函数,状态常量和控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用 nil 补足,多出部分会被忽略。
第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,
状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
第三,将迭代函数返回的值赋给变量列表。
第四,如果返回的第一个值为 nil 循环结束,否则执行循环体。 第五,回到第二步再次调用迭代函数。 更精确的来说:
for var_1, ..., var_n in explist do block end
等价于
do local _f, _s, _var = explist while true do local var_1, ... , var_n = _f(_s, _var)
_var = var_1 if _var == nil then break end
block end
end