lua таблица с индексированными строками и распаковка - PullRequest
1 голос
/ 17 марта 2020

У меня есть таблица в lua, заполненная элементами со строковым индексом. К сожалению, известно, что lua не справляется с этим совершенно (без головной боли), потому что оператор # и table.unpack() не будут работать

t = {}
t['b'] = 2
t['a'] = 1

print("l:", #t)
print("t:", table.unpack(t))

возвращает:

l:  0
t:

Существует решение для подсчета предметов (т.е.: подсчет таблиц с индексами строк в lua), но я не смог найти замену кому-то table.unpack() можете подать руку?

Желаемый вывод: 2 1 (в том же порядке, в котором я их добавил)

1 Ответ

2 голосов
/ 18 марта 2020

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

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

function unpack_unordered_recursive(tbl, key)
  local new_key, value = next(tbl, key)
  if new_key == nil then return end

  return value, unpack_unordered_recursive(tbl, new_key)
end

function unpack_unordered(tbl)
  local key, value = next(tbl)
  if key == nil then return end

  return value, unpack_unordered_recursive(tbl, key)
end

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

function unpack_indices(tbl, indices, curr_ix)
  if curr_ix == nil then
    return unpack_indices(tbl, indices, 1)
  end

  if curr_ix > #indices then
    return
  end

  --Recursive call
  return tbl[indices[curr_ix]], unpack_indices(tbl, indices, curr_ix + 1)
end

print("t:", unpack_indices(t, {"b", "a"}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...