Как сравнить результаты двух функций с несколькими возвращаемыми значениями в одном выражении? - PullRequest
4 голосов
/ 18 октября 2019

Я написал тестовую служебную функцию 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 );

но это дает синтаксическую ошибку, потому что вещи возвращают кортеж, а не массив / таблицу.

Я попытался исправить это с помощью конструктора массива, который должен был преобразовать кортеж в массив / таблицу.

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

Хотя это работает, это довольно громоздко и было бы такгораздо приятнее иметь весь чек в одной строке ... но как?

1 Ответ

4 голосов
/ 18 октября 2019
function stuff() return 1,2,3 end

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

При таком использовании список, возвращаемый stuff (), будет сокращен до первого элемента, поскольку stuff () не является последним выражением в этом списке выражений.

Вы можете поменять таблицуи прочее (), чтобы обойти это простым способом.

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

Или использовать таблицы в соответствии с комментариями Егора.

С Lua 5.3 Справочное руководство 3.4 Выражения

И вызовы функций, и выражения vararg могут иметь несколько значений. Если в качестве оператора используется вызов функции (см. §3.3.6), то его список возвращаемых значений корректируется до нулевых элементов, тем самым отбрасывая все возвращаемые значения. Если выражение используется в качестве последнего (или единственного) элемента списка выражений, то никакие корректировки не производятся (если выражение не заключено в скобки). Во всех других контекстах Lua настраивает список результатов на один элемент , либо отбрасывая все значения, кроме первого, либо добавляя один ноль, если значений нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...