lua 范性for的语义
范性for的执行过程:
首先,初始化,计算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
如果我们的迭代函数是f,状态常量是s,控制变量的初始值是a0,那么控制变量将循环:a1=f(s,a0)、a2=f(s,a1)、……,直到ai=nil。
如:
function it(a,i)
if i < 10 then
i=i+1
return i,a[i],"example"
else
return nil
end
end
function ip(a)
return it,a,0
end
a = {"one", "two", "three"}
for i,v,e in ip(a) do
print(i,v,e)
end
if i < 10 then
i=i+1
return i,a[i],"example"
else
return nil
end
end
function ip(a)
return it,a,0
end
a = {"one", "two", "three"}
for i,v,e in ip(a) do
print(i,v,e)
end
莫愁前路无知己,天下无人不识君。