Почему Lua корректирует результаты таким образом?
Я читаю Справочное руководство Lua, и там написано:
И вызовы функций, и выражения vararg могут привести к нескольким значениям. [...] Если выражение используется в качестве последнего (или единственного) элемента списка выражений, то никакие корректировки не производятся (если вызов не заключен в скобки). Во всех других контекстах Lua настраивает список результатов на один элемент, отбрасывая все значения, кроме первого.
Каковы преимущества этого выбора?
Это общее для других языков программирования?
2 ответа
Другие языки, которые допускают функции vararg и множественные возвращаемые значения, обычно требуют, чтобы вы были более явными. У них нет тихого ярлыка для получения первого предмета, как у Луа. Вот несколько возможных причин сделать это способом Lua:
- Вероятно, наиболее важной причиной является то, что можно получить количество явных элементов из нескольких значений, даже если они заканчиваются на
nil
, Увидетьselect
а такжеtable.pack
, Неявное преобразование в таблицу потеряло бы эту информацию. - Вы можете добавить второе значение к
return
утверждение без нарушения обратной совместимости. В противном случае вызывающий код должен был бы измениться, чтобы получить доступ к первому возвращаемому значению. - Иногда вторым возвращаемым значением является сообщение об ошибке. Lua позволяет нам игнорировать ошибку, делая вид, что у функции есть только одно возвращаемое значение. (Хотя это, вероятно, недостаток, а не преимущество.)
- У синтаксического сахара могут быть и другие преимущества, о которых я не думал.
С одной стороны, если вы поддерживаете несколько возвращаемых значений, вы, вероятно, захотите что-то вроде следующей работы:
local x, y, z = a()
С другой стороны, без текущего правила, следующий код
local x, y, z = b(), c()
очень сложно анализировать: x
, y
, а также z
может содержать возвращаемые значения b()
если он возвращает хотя бы 3 значения (c()
возвращаемые значения в этом случае полностью удаляются), или они могут содержать только возвращаемые значения c()
(дополненный заполнен nil
s) если b()
вообще не возвращает никаких значений или их различных комбинаций. Обратите внимание, что количество возвращаемых значений функций может варьироваться в зависимости от обстоятельств.
С действующим правилом x
всегда получает первое возвращаемое значение (которое часто является наиболее важным) из b()
(или возможно nil
если b()
не возвращает), y
всегда получает первое возвращаемое значение c()
(или же nil
), и и c
получает второе возвращаемое значение c()
или же nil
, Красиво и легко, и первый случай использования выше также покрыт.
Так что причина в том, что проще расшифровать, просто взглянув на присвоение, какая переменная получает какое возвращаемое значение То же самое касается вызовов функций, кстати:
function f( x, y, z )
-- ...
end
f( b(), c() )