Использование ключей таблицы с периодами в Lua - PullRequest
1 голос
/ 27 июня 2011

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

a = { x = 4 }

... или, возможно, как ...

a = { ['x'] = 4 }

Достаточно просто.Однако, если я ввожу точки в ключ (как в доменном имени), кажется, ничего не работает.Все перечисленные ниже ошибки:

a = { "a.b.c" = 4 }
a = { a.b.c = 4 }
a = { ['a.b.c'] = 4 }
a = { ["a.b.c"] = 4 }
a = { [a.b.c] = 4 }

Все они возвращают одну и ту же ошибку:

$ ./script.lua
/usr/bin/lua: ./script.lua:49: `}' expected near `='

Чего мне здесь не хватает?Некоторые из примеров кажутся довольно простыми и должны работать (в то время как другие имеют очевидные проблемы).

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

В элементе таблицы lua может быть либо Имя, либо Выражение. Ссылаясь на ссылку на язык, «Имена (также называемые идентификаторами) в Lua могут быть любой строкой букв, цифр и подчеркиваний, не начинающейся с цифры.», А все остальное интерпретируется как идентификатор в этом контексте. Поэтому a.b.c как индекс таблицы рассматривается как выражение, которое оценивается для получения фактического индекса таблицы. Это будет работать, но будет бесполезно:

a = { b = { c = 1 } }
x = {}
x['a.b.c'] = 7

print(x['a.b.c'])

Также обратите внимание, что foo.a.b.c равно foo['a']['b']['c'], а не foo['a.b.c'].

2 голосов
/ 27 июня 2011
a = { ['a.b.c'] = 4 }
a = { ["a.b.c"] = 4 }

Эти два действительны.

a = { [a.b.c] = 4 }

Это может быть действительным, в зависимости от точных используемых идентификаторов. Например

b = { c = { d = "Ohai!" } } }
a = { [b.c.d] = 4 }

будет действительным.

Если ваш переводчик говорит вам, что они неверны, значит, вы либо сделали что-то не так, либо в интерпретаторе есть ошибка. Другие, однако, не будут действительными.

1 голос
/ 27 июня 2011

Что-то не так в вашем скрипте?

$ ./lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> a = { ["a.b.c"] = 4 }
> print (a["a.b.c"])
4
> print (a.a)
nil
...