Lua multiple assignment with tables

lua array
lua table insert key value
lua table functions
lua print table keys
print table lua
nested arrays lua
lua-table contains
lua list

This code:

function foo()
    return 1, 2, 3
end

bar = {}

bar = {a, b, c = foo()}

produces:

bar.a = nil
bar.b = nil
bar.c = 1

How can this be written so that you get:

bar.a = 1
bar.b = 2
bar.c = 3

without having to write something like this:

function foo()
    return 1, 2, 3
end

bar = {}
a, b, c = foo()

bar = {a = a, b = b, c = c}

BLUF

There's no straight forward or elegant way to do this. You'll have to do it manually like this

local r = { f() }           --> store all returned values in r
local bar = { }
local c = string.byte 'a'   --> start with 'a'
for _, v in ipairs(r) do
   local t = string.char(c)
   bar[t] = v               --> assign each value to respective letter
   c = c + 1
end

If you'd had a, b, c = foo() you'd get all the three values assigned to the three variables. However, you've

bar = { a, b, c = foo() }

This table constructor expression will get interpreted as the keys a, b, c getting inserted into the table, with only the last key having an associated value (aside: keys with no associated value are taken as nil; hence a and b never get inserted). Since there's only one variable to take the values returned by foo, except the first everything else it returns are discarded.

Alternatively bar = { foo() } will assign all values returned by foo as array values of bar. However, the key to access these would [1], [2], etc. and not 'a', 'b', etc.

Read below to know when the returned values get discarded and when they don't.


TL;DR All returned values are retained only when the function call is the last/only expression in a list of expressions; elsewhere all except the first are discarded.

Function call as a statement

In Lua, when we return multiple results from a function, all of them get discarded if the function call is a statement by itself.

foo()

will discard all three return values.

Function call in an expression

If it's used in an expression, only the first will be retained and everything else will be discarded.

x = foo() - 1
print(x)        -- prints 0; the values 2, 3 are discarded
Function call in an expression list

The entire list of values returned is retained only when the call appears as the last/only item in a list of expressions. Such list of expressions occur at four places in Lua:

  1. Multiple assignment

    E.g. local a, b, c, d = 0, f(). Here b, c, d get the values 1, 2, 3 respectively.

  2. Table constructor

    E.g. local t = { 0, f() }. All values returned by f are put into t following the first 0.

  3. Function call arguments

    E.g. g(a, f()). g would receive 4, not 2, arguments. a and the three values from f.

  4. return statement

    E.g. return 'a', f(). Additional to the string 'a', all values returned by f will be received at the calling end.

In all these situations, had f appeared not as the last expression in the list or wasn't the only expression, then all values it returned except the first would've been discarded.

Multiple assignment statement

In the multiple assignment statement, when the number of values assigned is lesser than number of variables, the extra variables be assigned to nil. When it's the other way around i.e if the number of variables are lesser, the extra values are discarded.

a, b, c = 1, 2         -- a = 1, b = 2, c = nil
a, b, c = 1, 2, 3, 4   -- 4 gets discarded

Lua multiple assignment with tables, BLUF. There's no straight forward or elegant way to do this. You'll have to do it manually like this local r = { f() } --> store all returned values in r� 4.1 – Assignment. Assignment is the basic means of changing the value of a variable or a table field: a = "hello" .. "world" t.n = t.n + 1 Lua allows multiple assignment, where a list of values is assigned to a list of variables in one step. Both lists have their elements separated by commas. For instance, in the assignment a, b = 10, 2*x

bar = {}
bar.a, bar.b, bar.c = foo()

4.1 – Assignment, Assignment is the basic means of changing the value of a variable or a table field : a = "hello" .. "world" t.n = t.n + 1. Lua allows multiple assignment, where a list� The order in which multiple assignments are performed is not defined. This means you shouldn't assume the assignments are made from left to right. If the same variable or table reference occurs twice in the assignment list the results may surprise you. > a, a = 1, 2 > print (a) 1 In the above example Lua does assignments from right-to-left, e.g. a=2 and then a=1. However we shouldn't depend on this being consistent in future versions of Lua.

bar = {}
local abc = foo()
bar.a, bar.b, bar.c = abc, abc, abc

Simply bar.a, bar.b, bar.c = foo() will only set bar.a to foo(), the other two will be set to nil because they get set to the second and third values respectively, and you've only given one value.

Lua multiple assignment with tables - lua - php, Lua multiple assignment with tables - lua. Alternatively bar = { foo() } will assign all values returned by foo as array values of bar. However, the key to access� Lua uses a constructor expression {} to create an empty table. It is to be known that there is no fixed relationship between a variable that holds reference of table and the table itself. When we have a table a with set of elements and if we assign it to b, both a and b refer to the same memory.

If you can, have foo() return a table formatted the right way.

function foo()
    return {a = 1, b = 2, c = 3}
end

bar = foo()

Lua Gotchas, Lua - Tables - Tables are the only data structure available in Lua that helps us is no fixed relationship between a variable that holds reference of table and the table value assignment mytable[1]= "Lua" --removing reference mytable = nil� Metatables, although normal Lua programs can only use them with tables, are in fact the mechanism at the core of the way Lua handles operators and operations, and they can in fact theoretically be used with any value. However, Lua only allows them to be used with tables and userdata values created with the undocumented newproxy function.

Lua - Tables, A multiple assignment allows the program to get both results: s, constructions in Lua: multiple assignments, arguments to function calls, table constructors, and � 3.3.3 – Assignment. Lua allows multiple assignments. Therefore, the syntax for assignment defines a list of variables on the left side and a list of expressions on the right side. The elements in both lists are separated by commas: stat ::= varlist ‘=’ explist varlist ::= var {‘,’ var} explist ::= exp {‘,’ exp}

Programming in Lua, A Lua table maps single (non-nil) keys to single values. Load the multikey module via require (you may want to assign a short variable name or add local� A multiple assignment allows the program to get both results: s, e = string.find("hello Lua users", "Lua") print(s, e) --> 7 9 Functions written in Lua also can return multiple results, by listing them all after the return keyword. For instance, a function to find the maximum element in an array can return both the maximum value and its location:

multikey -- A Lua Table Indexed by Multiple Keys, the preceding example) and the value of the item at that index in the array ( assigned to variable item). Tables as Dictionaries. Lua tables can also be set up to� In Lua programming language, apart from the above types of assignment, it is possible to have multiple lvalues and rvalues in the same single statement. It is shown below. g,l = 20,30

Comments
  • string.byte'a' will give you the ASCII value of 'a'--- no need for magic numbers.
  • Thanks for the tip! Fixed :)
  • So, there's no way to do structure (yes, it's a table) based multiple assigns other than assigning the members individually?
  • I'm not sure how it could be less individual than this. It's exactly what you tried, except in two lines. You can only bend the table constructor syntax so far.