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

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 需要“状态”变量 _s_?

我猜测这意味着迭代器函数不需要携带任何每个迭代器的状态(例如,ipairs 迭代器函数设计),但可以很容易地按需创建携带此状态的闭包,而其成本几乎为每次迭代一次,效率上的考虑对我来说并不那么清楚。

原文链接 https://stackoverflow.com/questions/5782054

点赞
stackoverflow用户4323
stackoverflow用户4323

为什么不呢?用其他方式做有什么好处吗?正如微软所说,每个改变某些事情的想法都会从“负100分”开始。

2011-04-25 19:13:24
stackoverflow用户34799
stackoverflow用户34799

因为三元组设计不会阻止您使用闭包,而另一种方法则会禁止您不使用闭包。有时外部状态设计是更简单的方法。

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

2011-05-18 15:47:43