【问题标题】:How can a comma-separated return statement in Lua act as a function call?Lua 中逗号分隔的 return 语句如何充当函数调用?
【发布时间】:2019-10-31 04:44:57
【问题描述】:

我是 Lua 的新手,想弄清楚下面 squares 函数中的 return 语句是如何在以下代码 sn-p 中使用的:

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

return 语句中的 square 参数指的是具有以下签名的函数:

function square(iteratorMaxCount,currentNumber)

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

谁能向我解释一下这个语法发生了什么?这如何作为函数调用而不是返回三个值?在我看来,感觉好像返回语句应该写成 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

【问题讨论】:

  • 我回家后会看一下我的 Lua 书,但我认为这与“通用 for 循环”语法有关。反正代码不是很清楚。

标签: lua return


【解决方案1】:

squares 确实返回三个值,第一个是函数。 squares 根本不调用 square

这里的诀窍是 for ... in 语法的工作原理。在 Lua 5.3 Reference Manual 中,第 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 作为初始值,并且一个数字及其平方作为循环数据值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多