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

我刚开始学习 Lua 并试图弄清楚以下代码片段中 squares 函数内的 return 语句如何被使用:

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

其中 return 语句中的 square 参数是一个带有以下签名的函数:

function square(iteratorMaxCount,currentNumber)

让我感到困惑的是 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
点赞
用户459640
用户459640

squares 确实返回了三个值,其中第一个是一个函数。squares 并没有调用 square

关键在于 for ... in 语法如何工作。在 Lua 5.3 参考手册的第 3.3.5 节中写道:

类似于以下的 for 语句:

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)
     if var_1 == nil then break end
     var = var_1
     block
   end
 end

所以 " in" 关键字需要跟随三个值:

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

在第一次调用函数之后,上一次调用的第一个值会被传回到下一次函数调用中。当从函数返回的第一个值为 nil 时,for 循环就结束了。

因此,在这个示例中,squares(max) 被设计为在 " in" 之后使用,使用 square 作为迭代器函数,使用 max 作为 "状态",使用 0 作为初始值,以及一个数字和它的平方作为循环数据值。

2019-10-30 20:44:57