Lua - 为什么循环限制不是动态计算的?

Sat*_*hJM 3 iteration lua for-loop

好的,这是一个基本的循环

local a = {"first","second","third","fourth"}
for i=1,#a do 
    print(i.."th iteration")
    a = {"first"}
end 
Run Code Online (Sandbox Code Playgroud)

就像现在一样,循环执行所有4次迭代.

不应该计算for-loop-limit吗?如果它是动态计算的,#a在第一次迭代结束时将为1,for循环将中断....

肯定会更有意义吗?或者有什么特别的理由说明为什么不是这样的?

pra*_*pin 7

数值for循环限制仅计算一次的主要原因当然是性能.

使用当前行为,您可以在for循环限制中放置任意复杂表达式,而不会影响性能,包括函数调用.例如:

local prod = 1
for i = computeStartLoop(), computeEndLoop(), computeStep() do
  prod = prod * i
end
Run Code Online (Sandbox Code Playgroud)

如果computeEndLoop并且computeStep需要在每次迭代时调用,上面的代码将非常慢.

如果标准Lua解释器和最着名的LuaJIT与其他脚本语言相比如此之快,那是因为许多Lua功能在设计时考虑了性能.


在极少数情况下,单个评估行为是不合需要的,for使用while end或更容易用通用循环替换循环repeat until.

local prod = 1
local i = computeStartLoop()
while i <= computeEndLoop() do
  prod = prod * i
  i = i + computeStep()
end
Run Code Online (Sandbox Code Playgroud)