Как перебрать таблицу Lua, используя ключ, значение и индекс - PullRequest
1 голос
/ 24 марта 2019

Я хочу просмотреть таблицу, которая выглядит следующим образом

function add(t, k, v, ...)
    if k ~= nil then
        t[k] = v
        t[#t+1] = k
        return add(t, ...)
    end
    return t
end

my_table = add({ }, "a", 5, "b", 4, "c", 3)

for i,k in ipairs(my_table) do
    local v = my_table[k]
    print(k, v)
end

Результат:

а - 5

б - 4

с - 3

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

1 - а - 5

2 - б - 4

3 - с - 3

Возможно ли это в Луа?

Ответы [ 2 ]

3 голосов
/ 24 марта 2019

Итератор:

function triples(t)   
  local function next_triple(tbl, idx)
    idx = idx + 1
    local k = tbl[idx]
    if k ~= nil then 
      return idx, k, tbl[k]
    end
  end
  return next_triple, t, 0
end

Использование:

local a = {"q", "w", "e", q = 11, w = 22, e = 33}
for i, k, v in triples(a) do
  print(i, k, v)
end

Выход:

1   q   11
2   w   22
3   e   33
2 голосов
/ 25 марта 2019

Альтернативная реализация функции Егора triples с использованием сопрограмм:

function triples(t)
  return coroutine.wrap(function()
    for i, k in ipairs(t) do
      coroutine.yield(i, k, t[k])
    end
  end)
end
...