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

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

3 ответов


таблица литералов.

таблица является центральным типом В 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 будут иметь записи с именем "one", "pi", "half pi" и анонимную функцию. Конечно, поиск этого последнего элемента без итерации таблицы может быть сложным, если копия этой самой функции не хранится в какой-либо другой переменной.

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

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

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

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

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


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

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

посмотреть здесь


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

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

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

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

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

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