为什么Lua以这种方式调整结果?

时间:2017-10-16 20:28:17

标签: lua

我正在阅读Lua参考手册,并说:

  

函数调用和vararg表达式都可能导致多个值。 [...]如果表达式用作表达式列表的最后一个(或唯一的)元素,则不进行任何调整(除非调用括在括号中)。在所有其他上下文中,Lua将结果列表调整为一个元素,丢弃除第一个元素之外的所有值。

这种选择的优点是什么?

其他编程语言是否常见?

2 个答案:

答案 0 :(得分:2)

允许使用vararg函数和多个返回值的其他语言通常需要您更明确。正如Lua所做的那样,他们没有获得第一个项目的静默快捷方式。以下是Lua方式的一些可能原因:

  • 可能最重要的原因是,即使它们以nil结尾,也可以从多个值中获取显式项目的数量。请参阅selecttable.pack。隐式转换为表格会丢失此信息。
  • 您可以向return语句添加第二个值,而不会破坏向后兼容性。否则,调用代码必须更改才能访问第一个返回值。
  • 有时,第二个返回值是错误消息。 Lua让我们通过假装函数只有一个返回值来忽略错误。 (虽然这可能是一个缺点,但不是一个优势。)
  • 我没有想到的语法糖可能还有其他优点。

答案 1 :(得分:1)

一方面,如果您支持多个返回值,您可能需要类似以下工作:

local x, y, z = a()

另一方面,没有当前规则,以下代码

local x, y, z = b(), c()

很难分析:xyz如果返回至少3个值b(),则可以保留c()的返回值如果c()没有返回任何值,则它们的返回值在这种情况下会完全丢弃,或者它们只能保留nil的返回值(填充b() s)全部或其各种组合。请注意,函数的返回值的数量可能因环境而异。

使用,当前规则x始终获得b()的第一个返回值(通常是最重要的)(如果{nil,则可能b() 1}}不返回任何内容),y始终获得c()(或nil)的第一个返回值,而c获得第二个返回值{ {1}}或c()。很好,很容易,上面的第一个用例也被包含在内。

因此,原因在于,通过查看赋值哪个变量获得哪个返回值,更容易破译。函数调用也是一样,顺便说一下:

nil