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函数的设计),但它是相当的直接按需创建带有此状态的闭包,每次迭代的成本几乎是一次,基于效率的情况对我来说并不是那么清楚。
答案 0 :(得分:3)
因为三重设计不会阻止您使用闭包,而替代方法会阻止您使用闭包 。有时外部状态设计是更简单的方法。
例如,假设您正在使用for
循环来迭代在RESTful查询的响应中显示哪些页面。使用基于外部状态的循环,您可以编写一个函数,该函数基于表示查询的状态表示参数的表来迭代页面(您从URL构造一次并重用其他几个函数)。使用三元组,您可以只使用这些值进行迭代,而不必在封装构造函数中将其包装(以及类似其他所有函数)。
答案 1 :(得分:2)
为什么不呢?以其他方式做这件事有什么好处?正如他们在微软所说,每个想法都要改变一些事情starts out with minus 100 points。