我正在阅读Lua参考手册,并说:
函数调用和vararg表达式都可能导致多个值。 [...]如果表达式用作表达式列表的最后一个(或唯一的)元素,则不进行任何调整(除非调用括在括号中)。在所有其他上下文中,Lua将结果列表调整为一个元素,丢弃除第一个元素之外的所有值。
这种选择的优点是什么?
其他编程语言是否常见?
答案 0 :(得分:2)
允许使用vararg函数和多个返回值的其他语言通常需要您更明确。正如Lua所做的那样,他们没有获得第一个项目的静默快捷方式。以下是Lua方式的一些可能原因:
nil
结尾,也可以从多个值中获取显式项目的数量。请参阅select
和table.pack
。隐式转换为表格会丢失此信息。return
语句添加第二个值,而不会破坏向后兼容性。否则,调用代码必须更改才能访问第一个返回值。答案 1 :(得分:1)
一方面,如果您支持多个返回值,您可能需要类似以下工作:
local x, y, z = a()
另一方面,没有当前规则,以下代码
local x, y, z = b(), c()
很难分析:x
,y
和z
如果返回至少3个值b()
,则可以保留c()
的返回值如果c()
没有返回任何值,则它们的返回值在这种情况下会完全丢弃,或者它们只能保留nil
的返回值(填充b()
s)全部或其各种组合。请注意,函数的返回值的数量可能因环境而异。
使用,当前规则x
始终获得b()
的第一个返回值(通常是最重要的)(如果{nil
,则可能b()
1}}不返回任何内容),y
始终获得c()
(或nil
)的第一个返回值,而c
获得第二个返回值{ {1}}或c()
。很好,很容易,上面的第一个用例也被包含在内。
因此,原因在于,通过查看赋值哪个变量获得哪个返回值,更容易破译。函数调用也是一样,顺便说一下:
nil