Generics lua通用for循环规范

Generics lua通用for循环规范,generics,for-loop,lua,Generics,For Loop,Lua,我正在使用Lua 5.0,让我困惑的是为什么以下代码可以工作: for i in {first=1,second=2,third=3} do print(i) end 它打印“第一”、“第二”、“第三”。然而,根据Lua 5.0的在线编程 for所做的第一件事是计算in之后的表达式。这些表达式应产生for保留的三个值:迭代器函数、不变状态和控制变量的初始值 在本例中,In后面的表达式只是一个表。它不会计算为(函数、状态、初始值),任何后续调用都将是对表本身的调用。但是上面的示例可以工作

我正在使用Lua 5.0,让我困惑的是为什么以下代码可以工作:

for i in {first=1,second=2,third=3} do
    print(i)
end
它打印“第一”、“第二”、“第三”。然而,根据Lua 5.0的在线编程 for所做的第一件事是计算in之后的表达式。这些表达式应产生for保留的三个值:迭代器函数、不变状态和控制变量的初始值

在本例中,In后面的表达式只是一个表。它不会计算为(函数、状态、初始值),任何后续调用都将是对表本身的调用。但是上面的示例可以工作,为什么?

在Lua5.2(标准)中,此代码会产生错误

Runtime Error:
tst.lua:1: attempt to call a table value

因此,我不知道您在做什么,但无论如何,您所做的都是错误的。

上述for循环对4.0版有效,请参阅

像这样的陈述

   for index, value in exp do block end
等同于代码:

   do
     local _t = exp
     local index, value = next(t, nil)
     while index do
       block
       index, value = next(t, index)
     end
   end

如图所示,“in”之后的“exp”可以是一个表。这与5.0及以后版本中的for语法截然不同。然而,我的实验表明,5.0仍然尊重这种旧式风格。这就解释了我看到的情况。

如前所述,我使用的是Lua5.0,这里是输出:>对于{first=1,second=2}中的I,请执行打印(I)end first second>