Если в 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}