我有两个表,一个是键,另一个是值。我和他们一起创建了一个键值对表。目前我正在使用循环。还有更好的方法吗?
local keys={"fruit","bread","drink"}
local vals={"apple","french","milk"}
local kv={}
for i=1,#keys do
kv[keys[i]]=vals[i]
end
答案 0 :(得分:1)
面向对象编程?
-- You could do it in one line too, but this looks neater.
local kv = {fruit = "apple",
bread = "french",
drink = "milk"}
print(kv["fruit"])
print(kv.bread) -- Also works
for index, value in pairs(kv) do --Or you could do it in a for loop
print("index:", index, "value:", value)
end
你会得到:
apple
french
index: bread value: french
index: fruit value: apple
index: drink value: milk
答案 1 :(得分:0)
你没有回复我的评论,但无论如何这里都是答案。
正如其他人所说,您的代码适用于通用用例。特别是,如果您希望稍后操作kv
或keys
和values
稍后可能会更改,kv
应该是当前状态的快照。
在某些情况下,有一种更优雅的方式:
如果kv
的唯一目的是稍后迭代它(而不是操纵它或选择单个值),那么你可以编写一个可以与for
一起使用的迭代器,像这样
local keys={"fruit","bread","drink"}
local vals={"apple","french","milk"}:
local function zipkv()
local i = 0
return function ()
i = i + 1
return keys[i], vals[i]
end
end
for k,v in zipkv() do
print("key", k, "value", v)
end
迭代器kv
返回的函数将在每次迭代开始时调用,直到第一个返回值为nil
。这样做的好处是您不需要创建第三个表。您可以争辩说,您正在创建一个闭包而不是表,但如果您使用kv
遍历pairs
表,那么pairs
只是一个创建闭包的迭代器也是。
另一个区别(这是优势还是劣势取决于用例)是zipkv
将始终迭代当前状态keys
和vals
。因此,如果您在创建迭代器后更改它们,但在循环中使用迭代器之前,您将始终将两个表的当前状态压缩在一起。
所以这是一个案例,我可以想到,哪里有一个更优雅(更有效)的问题解决方案。但它的适用性有些限制,所以如果你正在寻找“最佳”的一般方法,而你已经找到它,我会说。