码迷,mamicode.com
首页 > 其他好文 > 详细

Lua程序设计 泛型for的定义

时间:2014-07-29 22:14:02      阅读:528      评论:0      收藏:0      [点我收藏+]

标签:style   io   for   ar   line   size   设计   程序   

      泛型for在循环过程内部保存了迭代器函数。实际上他保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。

泛型for的语法如下:
  for <var-list> in <exp-list>  do
  end
 其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式列表只有一个元素,即一句迭代器工厂的调用。
 
 for k, v in pairs(t) do print(k, v) end
 这其中,变量列表是"k,v",表达式列表只有一个元素pairs(t)。一般来说变量列表中也只有一个变量。
 for line in io.lines() do
    io.write(line, "\n")
 end
 
 变量列表的第一个元素称为"控制变量"。在循环过程中该值绝不会为 nil,因为当他为nil时循环就结束了。

     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

     因此,假设迭代器函数为f,恒定状态为s,控制变量的初值为a0。那么在循环过程中控制变量的值依次为a1 = f(s, a0) ,a2 = f(s, a1),依次类推,直至ai为nil结束循环。如果for还有其他变量,那么它们也会在每次调用f后获得额外的值。

Lua程序设计 泛型for的定义,布布扣,bubuko.com

Lua程序设计 泛型for的定义

标签:style   io   for   ar   line   size   设计   程序   

原文地址:http://my.oschina.net/u/223340/blog/295956

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!