Lua unpack() messing arguments
Asked Answered
I

1

7

I have this test function which simply prints values passed to it

function test1(...)
  for k, v in ipairs(arg) do
    print(v)    
  end
end

function test2(...)
  for k, v in pairs(arg) do
    print(v)    
  end
end

-- GOOD behavior
test1(1, 2, 3, 4) -- produces 1 2 3 4
test2(1, 2, 3, 4) -- produces 1 2 3 4

-- BAD behavior
test1( unpack({1,2}), 3, 4) -- produces 1 3 4
test2( unpack({1,2}), 3, 4) -- produces 1 3 4 3

Can someone explain this behavior to me ?

Irremissible answered 27/4, 2015 at 9:38 Comment(0)
C
10

This behavior is not specific to unpack. The Lua Reference Manual says:

"Both function calls and vararg expressions can result in multiple values. If a function call is used as a statement (see §3.3.6), then its return list is adjusted to zero elements, thus discarding all returned values. If an expression is used as the last (or the only) element of a list of expressions, then no adjustment is made (unless the expression is enclosed in parentheses). In all other contexts, Lua adjusts the result list to one element, either discarding all values except the first one or adding a single nil if there are no values."

(my emphasis)

Clovah answered 27/4, 2015 at 10:1 Comment(1)
For the curious: where all can a list of expressions occur in Lua?Node

© 2022 - 2024 — McMap. All rights reserved.