我写了一个测试实用函数 aequals
(断言相等),它期望实际结果和预期结果作为参数。我使用它的方式如下:
aequals(fib(8), 21);
现在我有一个具有多个返回值的函数:
function stuff() return 1,2,3 end
我想通过检查它的所有功能来检查它:
aequals( stuff(), {1,2,3} );
但是这样做不起作用,因为只有栈顶的 "1" 赋值给了 aequals
。
或者至少一个接一个地执行:
aequals( stuff()[1], 1 );
aequals( stuff()[2], 2 );
aequals( stuff()[3], 3 );
但这会产生语法错误,因为stuff返回的是元组,而不是数组/表格。
我尝试使用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 );
虽然这种方法可以工作,但它相当繁琐,如果能够将整个检查放在一行中,就会更加美观... 那么怎么做呢?
aequals( select(1, stuff()), 1 )
,用于比较多个值的函数:aequals_multiple( {stuff()}, {1,2,3} )
。 - Egor Skriptunoffselect
是个好主意。aequals_multiple
(或者aequals_table
/aquals_array
?)怎么工作呢?如果参数是表,aequals
不能自己检查吗?我尝试过{1,2,3} == {1,2,3}
,结果是false
,因为引用不同,参见 https://www.lua.org/pil/3.2.html。有没有逐元素比较的运算符?我想先写一个单独的函数。 - towi{stuff()}[1]
的方法是在表字面量周围加上括号:({ stuff() })[1]
。只有在字面值周围添加括号才能索引或调用方法。如果没有括号,会出现语法错误。类似地,"abc":sub(1, 1)
必须改为("abc"):sub(1, 1)
。 - cyclaminist