Как перебирать таблицу в Lua?

Итак, у меня есть таблица что-то вроде этих строк:

arr =
{
  apples = { 'a', "red", 5 },
  oranges = { 'o', "orange", 12 },
  pears = { 'p', "green", 7 }
}

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

arr =
{
  apples = { 0, 'a', "red", 5 },
  oranges = { 1, 'o', "orange", 12 },
  pears = { 2, 'p', "green", 7 }
}

Итак, теперь каждый раз, когда я использую одну из этих таблиц, я знаю, что такое индекс, но все еще не могу добраться до таблицы с помощью индекса, поэтому я начал писать функцию, которая проходит через них все, и проверьте индексы, пока он не найдет правильный. Потом я поняла... как я могу перебирать их, если я уже не могу ссылаться на них по их индексу? Так что теперь я застрял. Я действительно хочу иметь возможность печатать arr.яблоки против arr[1] большую часть времени, но, конечно, это необходимо делать и время от времени.

2 ответов


перебрать все пары ключ-значение в таблице, вы можете использовать pairs:

for k, v in pairs(arr) do
  print(k, v[1], v[2], v[3])
end

выходы:

pears   2   p   green
apples  0   a   red
oranges 1   o   orange

редактировать: обратите внимание, что Lua не гарантирует никакого порядка итерации для ассоциативной части таблицы. Если вы хотите получить доступ к элементам в определенном порядке, получают ключи от arr и сортировать его. Затем arr через сортированные ключи:

local ordered_keys = {}

for k in pairs(arr) do
    table.insert(ordered_keys, k)
end

table.sort(ordered_keys)
for i = 1, #ordered_keys do
    local k, v = ordered_keys[i], arr[ ordered_keys[i] ]
    print(k, v[1], v[2], v[3])
end

выходы:

  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7

Если вы хотите ссылаться на вложенную таблицу несколькими ключами, вы можете просто назначить их отдельным ключам. Таблицы не дублируются и по-прежнему ссылаются на одни и те же значения.

arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples

этот блок кода позволяет перебирать все пары ключ-значение в таблице (http://lua-users.org/wiki/TablesTutorial):

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