我已经编写了一个测试实用程序函数aequals
(等于),该函数期望实际结果和期望结果作为参数。我这样使用它:
aequals(fib(8), 21);
但是现在我有一个带有多个返回值的函数:
function stuff() return 1,2,3 end
我想通过全部检查来检查其功能:
aequals( stuff(), {1,2,3} );
但是这不起作用,因为aequals
的堆栈上只剩下“ 1”。
或至少一个接一个:
aequals( stuff()[1], 1 );
aequals( stuff()[2], 2 );
aequals( stuff()[3], 3 );
但这会带来语法错误,因为东西返回一个元组,而不是数组/表。
我试图使用array-constructor来解决这个问题,它应该将一个元组放入一个数组/表中。
aequals( {stuff()}[1], 1 );
为什么这是我无法理解的语法错误。
如果我只知道在哪里看,我通过定义我肯定已经在Lua中的助手功能来规避了这一点:
function arg0(a,b,c) return a end;
function arg1(a,b,c) return b end;
function arg2(a,b,c) return c end;
aequals( arg0(stuff()), 1 );
虽然这很有效,但是将整个检查都放在一行中会更好很多,但是如何呢?
function stuff() return 1,2,3 end
aequals( stuff(), {1,2,3} );
像这样使用,stuff()返回的列表将被简化为第一个元素,因为stuff()不是该表达式列表中的最后一个表达式。
您可以交换表和stuff(),以一种简单的方式规避它。
aequals({1,2,3}, stuff())
或使用Egor评论所建议的表格。
来自Lua 5.3 Reference Manual 3.4 Expressions
函数调用和vararg表达式都可能导致多个价值观。如果将函数调用用作语句(请参见第3.3.6节),则它的返回列表被调整为零元素,因此丢弃所有返回值。如果将表达式用作最后一个(或唯一)表达式列表的元素,则不进行调整(除非该表达式括在括号中)。 在所有其他情况下,Lua将结果列表调整为一个元素,要么放弃所有值除了第一个以外,如果没有值,则添加单个nil。