Используются ли фигурные скобки в Lua?

Если в Lua используются фигурные скобки ('{' и '}'), для чего они используются?

Ответ 1

Табличные литералы.

Таблица является центральным типом в Lua и может рассматриваться как ассоциативный массив (хеш-таблица или словарь) или как обычный массив. Ключами могут быть значения любого типа Lua, кроме nil, а элементы таблицы могут содержать любое значение, кроме nil.

Доступ к членам массива становится более эффективным, чем доступ к хеш-ключам за кулисами, но детали обычно не имеют значения. Это фактически упрощает обработку разреженных массивов, поскольку хранилище необходимо выделять только для тех ячеек, которые содержат значение вообще.

Это приводит к универсальной идиоме массива на основе 1, которая немного странна для программиста C.

Например

a = { 1, 2, 3 }

создает массив, хранящийся в переменной a, с тремя элементами, которые (по совпадению) имеют те же значения, что и их индексы. Поскольку элементы хранятся при последовательных индексах, начинающихся с 1, длина a (заданная #a или table.getn(a)) равна 3.

Инициализация таблицы с помощью нецелого ключа может быть выполнена следующим образом:

b = { one=1, pi=3.14, ["half pi"]=1.57, [function() return 17 end]=42 }

где b будут иметь записи с именем "один", "пи", "половина pi" и анонимная функция. Конечно, поиск последнего элемента без итерации таблицы может быть сложным, если только копия этой самой функции не хранится в какой-либо другой переменной.

Другое место, в котором фигурные фигурные скобки появляются, действительно является одним и тем же смысловым значением, но оно скрыто (для нового пользователя Lua) за синтаксическим сахаром. Обычно записываются функции, которые принимают один аргумент, который должен быть таблицей. В этом случае вызов функции не требует использования скобок. Это приводит к коду, который, как представляется, содержит сочетание () и {}, которые, по-видимому, используются как оператор вызова функции.

btn = iup.button{title="ok"}

эквивалентно

btn = iup.button({title="ok"})

но также менее трудно на глаза. Кстати, вызов функции с одним аргументом с литеральным значением также работает для строковых литералов.

Ответ 2

list/dinaryary constructor (т.е. конструктор типа таблицы).

Они не используются для блоков кода, если это то, что вы имеете в виду. Для этого Lua просто использует ключевое слово end для завершения блока.

Смотрите здесь

Ответ 3

Они используются для табличных литералов, как вы бы использовали в C:

t = {'a', 'b', 'c'}

Это единственный общий случай. Они не используются для разделителей блоков. В таблице lua вы можете поместить значения разных типов:

t={"foo", 'b', 3}

Вы также можете использовать их как dictionnaries, à la Python:

t={name="foo", age=32}