为什么Lua的迭代器是三元组?

时间:2011-04-25 19:05:10

标签: iterator lua language-design

Lua 5.1的参考手册说明了一个迭代器

 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

为什么Lua需要'state'变量, s

我猜想这意味着迭代器函数不需要携带任何per-iterator状态(参见,例如, ipairs iterator-yielding函数的设计),但它是相当的直接按需创建带有此状态的闭包,每次迭代的成本几乎是一次,基于效率的情况对我来说并不是那么清楚。

2 个答案:

答案 0 :(得分:3)

因为三重设计不会阻止您使用闭包,而替代方法会阻止您使用闭包 。有时外部状态设计是更简单的方法。

例如,假设您正在使用for循环来迭代在RESTful查询的响应中显示哪些页面。使用基于外部状态的循环,您可以编写一个函数,该函数基于表示查询的状态表示参数的表来迭代页面(您从URL构造一次并重用其他几个函数)。使用三元组,您可以只使用这些值进行迭代,而不必在封装构造函数中将其包装(以及类似其他所有函数)。

答案 1 :(得分:2)

为什么不呢?以其他方式做这件事有什么好处?正如他们在微软所说,每个想法都要改变一些事情starts out with minus 100 points