2017-02-21 39 views
2

Есть ли способ передать кортеж в качестве параметров функции Lua?Как передать кортеж в качестве аргументов функции Lua?

Например, у меня есть функция, которая возвращает несколько значений

function f(a,b) return b,a end 

и я хочу эту функцию f быть повторно применен, так что я могу написать:

f (f ... f(1,2)) 

Но что если мне нужно для хранения этого исходного кортежа (1,2) как переменная init?

f (f ... f(init)) 

Есть ли поддержка для этого?

Согласно this answer, кажется, что у python это с оператором splat *.

+1

"* так что я могу написать *" Это неправда Lua. 'f ... f' не является легальным синтаксисом Lua. Поэтому я не понимаю, чего ты хочешь здесь. –

+1

[Эта страница] (http://lua-users.org/wiki/FunctionalTuples) может вам помочь. – Thelmund

+1

@NicolBolas Вы можете написать, например. 'f (f (1,2)), f (f (f (1,2))) и т. д. для любого числа приложений' f'. Это то, что я имел в виду с '...' и 'повторно применять '. – tinlyx

ответ

3

Lua не имеет «кортежей».

Когда функция возвращает несколько значений, она возвращает несколько значений. Они не объединены в какую-либо структуру данных; они являются отдельными значениями. Если вы хотите сохранить несколько возвращаемых значений в одной структуре данных, вы должны это сделать.

Lua 5.2 имеет функцию table.pack, которую вы можете использовать для хранения нескольких возвращаемых значений в таблице. Но он делает это таким образом, что вы можете разложить их позже:

local values = table.pack(f(1, 2)) 

f(table.unpack(values, values.n)) 

unpack существует в Lua 5.1, но pack не делает. Вы можете легко его эмулировать:

function pack(...) 
    return {n = select("#", ...), ...} 
end