将lua表解包为对象,并将其映射为函数参数

将lua表解包为对象,并将其映射为函数参数,lua,Lua,我正在寻找一种方法来解压缩lua表(对象,而不是数组),并将返回值作为参数映射到函数。 例如: 局部函数f(a,b,c,d) 打印(a、b、c、d) 结束 --秩序被故意搞得一团糟 本地对象\u到\u解包={ a=1, c=42, d=18, b=102 } 所以我在寻找一种方法来做类似的事情 f(unpack_和_映射(object_to_unpack))和函数输出1、102、42、18。 我知道unpack函数,但它只在数组上工作,不在对象上工作,而且我没有任何排序保证(如object\u

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

局部函数f(a,b,c,d)
打印(a、b、c、d)
结束
--秩序被故意搞得一团糟
本地对象\u到\u解包={
a=1,
c=42,
d=18,
b=102
}
所以我在寻找一种方法来做类似的事情
f(unpack_和_映射(object_to_unpack))
和函数输出
1、102、42、18

我知道
unpack
函数,但它只在数组上工作,不在对象上工作,而且我没有任何排序保证(如object\u to\u unpack中所示)

不确定为什么要解包该表,而不仅仅将其用作函数参数

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

顺序是故意弄乱的
部分是不相关的,它在表中总是“弄乱”的,您无法控制哈希表中值的顺序是的,我知道,在那里没有什么坏处
不确定您为什么要解包该表,而不仅仅是将其用作函数参数
我现在正在这样做,但是我是在一个例子中这样做的,我有多个具有不同参数的函数,我从同一个地方调用它们(类似于
local fn=get\u function\u by\u some\u condition(condition)fn(args)
所以我必须编写许多函数来从表中提取这些参数,这不是很糟糕,但这会更好。按字母顺序输入函数参数非常不寻常,而且容易出错。我不建议这样做。一个nil值就足以导致不匹配。