Lua 中逗号分隔的 return 语句如何充当函数调用?

Piz*_*ato 4 lua return

我是 Lua 的新手,并试图弄清楚下面的squares函数中的return语句是如何在以下代码片段中使用的:

function squares(iteratorMaxCount)
   return square,iteratorMaxCount,0
end
Run Code Online (Sandbox Code Playgroud)

return 语句中的square参数引用了具有以下签名的函数:

function square(iteratorMaxCount,currentNumber)
Run Code Online (Sandbox Code Playgroud)

让我困惑的是return语句看起来像是返回三个值。然而,我认为它实际上在做的是将iteratorMaxCount0作为参数传递给square函数调用。

谁能向我解释这种语法发生了什么?这如何作为函数调用而不是返回三个值?在我看来,似乎 return 语句应该写成return square(iteratorMaxCount, 0)而不是return square, iteratorMaxCount, 0。我知道这显然是错误的,但我不知道为什么。

我试过搜索 Lua 手册、Lua 参考指南和 Google 搜索,但似乎找不到任何解释这种特定语法的内容。任何人都可以指出我正确的方向吗?

提前致谢。

通过Tutorialspoint下面的完整代码

function square(iteratorMaxCount,currentNumber)

   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end

end

function squares(iteratorMaxCount)
   return square,iteratorMaxCount,0
end  

for i,n in squares(3)
do 
   print(i,n)
end
Run Code Online (Sandbox Code Playgroud)

asc*_*ler 5

squares确实返回三个值,其中第一个是函数。squares根本不打电话square

这里的诀窍是for...in语法是如何工作的。在 Lua 5.3 参考手册中,第 3.3.5 节说:

像这样的for语句:

for var_1, ···, var_n in explist do block end
Run Code Online (Sandbox Code Playgroud)

相当于代码:

 do
   local f, s, var = explist
   while true do
     local var_1, ···, var_n = f(s, var)
     if var_1 == nil then break end
     var = var_1
     block
   end
 end
Run Code Online (Sandbox Code Playgroud)

所以关键字“ in”后面需要跟三个值:

  1. 用于在每次迭代中获取变量的“迭代器函数”
  2. 每次传递给函数的“状态”值
  3. 第一次传递给函数的初始值

在第一次调用该函数后,前一次调用的第一个值将传递回下一次函数调用。当函数返回的第一个值是 时nilfor循环结束。

所以在这个例子中,squares(max)被设计为在“ in”之后使用,square作为迭代器函数,max作为“状态”,0作为初始值,以及一个数字及其平方作为循环数据值。