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

问题描述 投票:2回答:1

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

虽然这很有效,但是将整个检查都放在一行中会更好很多,但是如何呢?

lua multiple-return-values
1个回答
0
投票
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。

© www.soinside.com 2019 - 2024. All rights reserved.