table.unpack() only returns the first element

Andreas picture Andreas · Sep 7, 2015 · Viewed 9.4k times · Source

Could somebody explain to me why table.unpack() returns the first table element only when it is used in a function call with additional parameters after table.unpack()?

Here is some demo code:

local a = {1,2,3,4,5}
print("Test", table.unpack(a))   -- prints "Test 1 2 3 4 5"
print(table.unpack(a), "Test")   -- prints "1 Test"

I don't understand why the second line just prints 1 Test. I'd expect it to print 1 2 3 4 5 Test. Can somebody explain this behaviour? I'd also be interested in how I can make the second call to print 1 2 3 4 5 Test.

Answer

ntki picture ntki · Sep 7, 2015

table.unpack returns multiple values. The defined behavior in that case is that if it is not the last one in a list of expressions then all but the first returned value will be discarded.

From the book:

Lua always adjusts the number of results from a function to the circumstances of the call. When we call a function as a statement, Lua discards all of its results. When we use a call as an expression, Lua keeps only the first result. We get all results only when the call is the last (or the only) expression in a list of expressions.

As a workaround you can append the rest of the arguments to the table and make the table the last argument that way.