Lua泛型for

在学习Lua泛型for的过程中,我想实现ipairs的功能,写了如下代码:

1 function my_ipairs(table_name)
2     local i = 0
3     return function() i = i + 1;return i,table_name[i];end
4 end
5 
6 for k,v in my_ipairs({2,3,5,6}) do
7     print (k,v)
8 end

结果死循环了....

我很疑惑泛型for的工作过程是怎样的.查阅内容如下:

 

泛型for的语义

泛型for比较复杂,它在循环过程内保存了迭代器函数。它实际上保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。接下来,分别进行总结。

泛型for的语法如下:

for <var-list> in <exp-list> do
     <body>
end

其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式列表只有一个元素,即一句对迭代器函数的调用。例如:

for k, v in pairs(t) do print(k, v) end

for做的第一件事就是对in后面的表达式求值,这些表达式应该返回3个值供for保存:迭代器函数、恒定状态和控制变量的初值。这里和多重赋值是一样的,只有最后一个表达式才会产生多个结果,并且只会保留前3个值,多余的值会被丢弃;而不够的话,就以nil补足。

 

在初始化完成以后,for会以恒定状态和控制变量来调用迭代器函数。然后for将迭代器函数的返回值赋予变量列表中的变量。如果第一个返回值为nil,那么循环就终止,否则,for执行它的循环体,随后再次调用迭代器函数,并重复这个过程。在前言部分的代码中,只是返回了迭代器函数,并没有返回恒定状态和控制变量。下面通过代码来说明这个问题,比如:

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
end

 

posted on 2015-04-02 17:47  byleaf  阅读(3119)  评论(0编辑  收藏  举报

导航