Понимание того, как получить доступ к значениям в массиве таблиц в lua - PullRequest
2 голосов
/ 16 января 2020

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

local coupledNumbers = {}
local a = 10
for i = 1, 12 do
    for j = 1, 12 do
        table.insert(coupledNumbers, {ID = a, result = i*j})
        a = a + 10
    end
end

Этот l oop даст мне ключи (от 1 до 144)

for k, v in pairs (coupledNumbers) do
    print (k)
end

Этот l oop даст мне значения (что-то вроде: table: 0xc475fce7d82c60ea)

for k, v in pairs (coupledNumbers) do
    print (v)
end

Мой вопрос: как мне попасть в значения внутри таблицы?

как получить идентификатор и результат. Я думал, что-то подобное будет работать:

print (coupledNumbers[1].["ID"])

или

print (coupledNumbers[1].["result"])

Но это выдает ошибку.

Ответы [ 3 ]

3 голосов
/ 16 января 2020

Как правильно сказал Аллистер, ошибка заключается именно в том, что .[. Но я хочу кое-что добавить: точечная запись и скобка могут сделать то же самое, но это не всегда так.

Я хотел бы добавить, что скобочная запись позволяет вам использовать переменные для ссылок на поля. Например, если у вас есть следующий фрагмент:

local function getComponent(color, component)
   return color[component]
end

local c = {
   cyan = 0,
   magenta = 11,
   yellow = 99,
   black = 0
}

print(getComponent(c, "yellow"))

Вы просто не можете сделать это, используя точечную запись. Следующее всегда будет возвращать nil:

local function getComponent(color, component)
   return color.component
end

Это потому, что он будет искать поле с именем component в color (которое не существует в этой модели).

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

3 голосов
/ 16 января 2020

Обозначения точек и скобок различны. Ваша ошибка заключается в использовании их обоих для индексирования одной вещи. ([1].["ID"]) Проблема заключается в .[

Точечная нотация: Table.a.b

Нотация в скобках: Table["a"]["b"]

Если вы хотите смешать их, вы может сделать Table.a["b"] или Table["a"].b

Так что вы хотите сделать что-то вроде coupledNumbers[1].ID или coupledNumbers[1]["ID"]

На самом деле, насколько я знаю, это всего лишь личные предпочтения edit: See Pedro's answer for information on the use of variables in dot notation., хотя вы не можете получить элемент nth массива с точечной нотацией, поэтому вы всегда будете индексировать число с помощью [n]

1 голос
/ 16 января 2020

Из L ua 5.3 Справочное руководство - 3.2 Переменные

Квадратные скобки используются для индексации таблицы:

var ::= prefixexp ‘[’ exp ‘]’

Синтаксис var.Name - это просто синтаксис c сахар для var["Name"]:

var ::= prefixexp ‘.’ Name

Вы можете использовать только точечную нотацию для индексации значения таблицы, если ваш Ключ таблицы является литеральной строкой. Наличие [ после оператора точки не имеет смысла для интерпретатора Lua, поскольку он ожидает буквальную строку.

Замените coupledNumbers[1].["ID"] на coupledNumbers[1].ID

...