В Lua используются фигурные скобки? - PullRequest
14 голосов
/ 26 марта 2009

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

Ответы [ 3 ]

41 голосов
/ 27 марта 2009

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

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

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

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

Например

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"})

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

4 голосов
/ 26 марта 2009

конструктор списка / Ditionary (то есть конструктор табличного типа).

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

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

1 голос
/ 06 апреля 2009

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

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

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

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

Вы также можете использовать их как словари, а-ля Python:

t={name="foo", age=32}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...