【问题标题】:lua string-indexed table and unpacklua 字符串索引表并解压
【发布时间】:2020-06-28 20:42:33
【问题描述】:

我在 lua 中有一个由字符串索引项填充的表。不幸的是,众所周知,lua 无法以完美(无头痛)的方式处理此问题,因为 # 运算符和 table.unpack() 将不起作用

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

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

返回:

l:  0
t:

有计算项目的解决方案(即:counting string-indexed tables in lua),但我找不到 table.unpack() 的替代品,有人可以帮忙吗?

所需的输出是:2 1(与我添加它们的顺序相同)

【问题讨论】:

  • 您的unpack 将如何工作?如何为要解包的值定义顺序?它只是值还是将它们解压缩为类似{{key="a", value =1}, {key="b", value =2}} 结构的数组。这些问题就是为什么您不会看到 1 尺寸适合所有解决方案的原因,因为您希望 unpack 的行为方式可能特定于您的结构
  • 顺序现在不重要,我可以先排序后排序。理想情况下,我希望按照它们添加到表中的相同顺序打开它们,但这不是强制性的
  • 不清楚您期望print("t:", table.unpack(t)) 必须给出什么? print("t:", table.unpack({'a','b','c'}))t: a b c
  • 我编辑了我的问题
  • @aster94:您已经说过想要的输出是什么,但没有为什么说这是想要的输出。也就是说,您是否希望输出是因为您按该顺序“插入”了密钥?因为该信息不存在。

标签: lua


【解决方案1】:

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"}))

【讨论】:

  • unpack_indices 版本非常完美,谢谢
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2012-01-13
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多