Lua: неявное создание таблицы со строковыми ключами - зачем лишние скобки? - PullRequest
13 голосов
/ 23 декабря 2010

Скажите, что вы хотите создать таблицу Lua, и все ее ключи являются действительными идентификаторами lua.Затем вы можете использовать синтаксис key=value:

local niceTable = { I=1, like=1, this=1, syntax=1 }

Если, однако, ваши строки не являются "идентифицируемыми", то вы должны использовать синтаксис ['key']=value:

local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' }

IЯ немного озадачен по этому поводу.Что эти скобки делают там?Что они значат?

Ответы [ 2 ]

21 голосов
/ 23 декабря 2010

Обычный синтаксис для индексации таблицы - t[val].Только для строковых ключей Lua предоставляет синтаксис альтернативный , где t.foo в точности эквивалентно t["foo"].Это чисто синтаксическое удобство, так называемый «синтаксический сахар».Он не добавляет функциональности, он просто дает вам менее загроможденный синтаксис для использования строк в качестве именованных полей.

Существует множество строковых ключей, для которых не будет работать:

t["hello_world"] => t.hello_world  -- works
t["hello world"] => t.hello world  -- oops, space in the string
t["5 * 3"]       => t.5 * 3        -- oops
t['[10]']        => t.[10]         -- oops

В основном это работает только в том случае, если строковым ключом будет действительный идентификатор.

Опять же, таблицы индексируются через [], и в большинстве случаев вам нужно использовать их:

t = {
   -- [key]           = value
   [10]               = "ten", -- number key, string value
   ["print function"] = print, -- string key, function value
   ["sub table"]      = {},    -- string key, table value
   [print]            = 111,   -- function key, number value
   ["foo"]            = 123,   -- string key, number value
}

Только если вы используете строковый ключ, который будет работать как действительный идентификатор (без пробелов, содержит только символы слов, цифры или подчеркивания и не начинается с цифры), вы можете использовать синтаксис ярлыка.Для приведенной выше таблицы это будет только 'foo':

t = {
   -- [key]           = value
   [10]               = "ten", -- number key, string value
   ["print function"] = print, -- string key, function value
   ["sub table"]      = {},    -- string key, table value
   [print]            = 111,   -- function key, number value
   foo                = 123,   -- string key, number value
}
19 голосов
/ 23 декабря 2010

Они идентифицируют содержащуюся строку как ключ в итоговой таблице. Первую форму вы можете считать равной

local niceTable = {}
niceTable.I = 1;
niceTable.like = 1;

Вторая форма равна

local operators = {}
operators['*'] = "Why";
operators['+'] = "The";

Разница чисто синтаксическая, за исключением случаев, когда первый использует идентификаторы, поэтому он должен следовать правилам идентификатора, например, не начинается с числа и постоянной времени интерпретации, а вторая форма использует любую старую строку таким образом, его можно определить, например, во время выполнения, и строку, которая не является допустимым идентификатором. Тем не менее, результат в основном тот же. Потребность в скобках легко объяснима.

local var = 5;
local table = {
    var = 5;
};
-- table.var = 5;

Здесь var - это идентификатор, а не переменная.

local table = {
    [var] = 5;
};
-- table[5] = 5;

Здесь var - это переменная, а не идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...