如何在一个表达式中比较两个具有多个返回值的函数的结果?

我编写了一个测试实用函数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 );

但是这会导致语法错误,因为stuff返回的是一个元组,而不是一个数组/表。

我尝试使用数组构造函数来解决这个问题,它被认为是将元组转换为数组/表的方法。

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 );

虽然这是有效的,但非常繁琐,如果整个检查可以在一行中完成,那将是更好的...但是如何实现?

点赞
用户2858170
用户2858170
function stuff() return 1,2,3 end

aequals( stuff(), {1,2,3} );

当使用上述方式时,stuff() 返回的列表将会被缩减为其第一个元素,因为它不是该表达式列表中的最后一个表达式。

可以交换表和 stuff() 来简单地避免这种情况。

aequals({1,2,3}, stuff())

或者按照 Egor's 的评论建议使用表。

来自Lua 5.3 参考手册 3.4 表达式

函数调用和可变参数表达式都可以导致多个值。如果一个函数调用被用作语句(见§3.3.6),那么它的返回列表将被调整为零个元素,因此丢弃所有返回的值。如果一个表达式被用作一个表达式列表的最后一个(或唯一一个)元素,那么不进行调整(除非表达式是括在括号中的)。在所有其他上下文中,Lua 将结果列表调整为一个元素,要么丢弃所有值除了第一个值,要么添加一个单一的 nil 如果没有值。

2019-10-18 10:36:11