I came across tables that have square brackets around keys:
local commands_json =
{
["request"] = {
["application"] = PW_APPLICATION,
["push_token"] = deviceToken
}
}
Can the square brackets be omitted?
I came across tables that have square brackets around keys:
local commands_json =
{
["request"] = {
["application"] = PW_APPLICATION,
["push_token"] = deviceToken
}
}
Can the square brackets be omitted?
It's simply the long form of specifying keys in a table. You can put any value between the []
(except nil
. And floating-point NaNs). Whereas without them, you can only use identifiers.
For example, this is a compile error, since "key name" isn't an identifier (due to the space):
tbl =
{
key name = 5,
}
In contrast, the following example does work:
tbl =
{
["key name"] = 5,
}
The following example with quotes and without square brackets is a compile error:
tbl =
{
"key name" = 5,
}
If Lua sees a naked value like this, it thinks you're trying to add to the array part of the table. That is, it confuses it with:
tbl =
{
"key name",
}
Which creates a 1-element array, with tbl[1]
equal to "key name"
. By using []
, the compiler can easily tell that you meant for something to be a key rather than the value of an array element.
The long form also lets you distinguish between:
local name = "a name";
tbl =
{
["name"] = 5,
[name] = 7,
}
The second part means to evaluate the expression name
, the result of which will be the key. So this table has the keys "name"
and "a name"
.
.
notation is important for ease-of-use. For tables that are more like associative data arrays, notation is irrelevant. –
Frumpish nil
; 5.2+ adds floating-point NaN to that list, for obvious reasons. –
Frumpish You cannot omit the brackets
> x = { 'a' = 1 }
stdin:1: '}' expected near '='
the correct code is
> x = { ['a'] = 1 }
> print(x['a'])
1
or
> x = { a = 1 }
> print(x['a'])
1
However, the second one has its limitations. What if you want to have a key called "-"?
> x = { - = 1 }
stdin:1: unexpected symbol near '='
> x = { '-' = 1 }
stdin:1: '}' expected near '='
again the correct way is to use brackets
> x = { ['-'] = 1 }
> print(x['-'])
1
Or you want to create a field of name which is contained in a variable called a
?
> a = 'cat'
> x = { [a] = 1 }
> print(x['cat'])
1
Brackets are used as a general form of key creation, they give you ability to put any hashable object as a key - not only strings.
© 2022 - 2024 — McMap. All rights reserved.
[exp1] = exp2
adds to the new table an entry with keyexp1
and valueexp2
..... In other words, the key value is determined at run-time. – Erickericka