【问题标题】:Unpack lua table as object and map them as function arguments将 lua 表解包为对象并将它们映射为函数参数
【发布时间】:2021-03-26 18:22:35
【问题描述】:

我正在寻找一种方法来解压缩 lua 表(对象,而不是数组)并将返回值作为参数映射到函数。 示例:

local function f(a, b, c, d)
    print(a, b, c, d)
end

--order is messed up on purpose
local object_to_unpack = {
    a = 1,
    c = 42,
    d = 18,
    b = 102
}

所以我正在寻找一种方法来做类似的事情 f(unpack_and_map(object_to_unpack)) 和用于输出 1, 102, 42, 18 的函数。 我知道unpack 函数,但它只适用于数组,而不适用于对象,而且我没有任何排序保证(如 object_to_unpack 所示)

【问题讨论】:

  • order is messed up on purpose 部分无关紧要,它在表中总是“混乱”,您无法控制哈希表中值的顺序
  • 是的,我知道,去那里也无妨

标签: lua


【解决方案1】:

不知道为什么要解压该表而不只是将其用作函数参数。

local someTable = {
  a = 1,
  c = 42,
  d = 18,
  b = 102,
}

local function f(t)
  print(t.a, t.b, t.c, t.d)
end

f(someTable)

如果您坚持使用表达式列表调用f,您需要创建一个。

function f(...)
  print(...)
end

local args = {}
for _, v in pairs(someTable) do
  table.insert(args, v)
end

f(table.unpack(args))

这不保证任何订单。如果您想要按键排序的列表,您需要在调用 f 之前对该列表进行排序。

local keys = {}
for k in pairs(someTable) do
  table.insert(keys, k)
end
table.sort(keys)
local args = {}
for _, key in ipairs(keys) do
  table.insert(args, someTable[key])
end

f(table.unpack(args))

【讨论】:

  • Not sure why you want to unpack that table and not just use it as the functions parameter 我现在正在这样做,但我这样做是在我有多个具有不同参数的函数的情况下,我从同一个地方调用(类似于local fn = get_function_by_some_condition(condition) fn(args) 所以我必须写许多从表中提取这些参数的函数,这还不错,但这会好得多。
  • 按字母顺序输入函数参数是非常不寻常且容易出错的。我不建议这样做。单个 nil 值足以导致不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2020-07-09
  • 2019-05-12
相关资源
最近更新 更多