制作键值对的表格
问题描述:
我有两个表格,一个是键值,另一个是值。我加入他们来创建一个键值对表。目前我正在使用一个循环。有没有更好的办法?制作键值对的表格
local keys={"fruit","bread","drink"}
local vals={"apple","french","milk"}
local kv={}
for i=1,#keys do
kv[keys[i]]=vals[i]
end
答
您没有回应我的评论,但无论如何,这是一个答案。
正如其他人所说的,你的代码对于通用的用例来说很好。特别是,如果您稍后要操作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
。这具有您不需要创建第三个表格的优点。你可能会争辩说,而不是你正在创建一个闭包的表,但是如果你要使用pairs
遍历你的kv
表,那么pairs
也只是一个迭代器来创建闭包。
另一个差别(这是否是一个优势或劣势还是取决于使用情况)是zipkv
总是遍历的keys
和vals
当前状态。因此,如果在创建迭代器之后但在循环中使用迭代器之前要更改它们,则始终会将两个表的当前状态一起压缩。
所以这是一种情况,我可以想到,哪里有一个稍微更优雅(和更有效)的解决方案,以解决您的问题。但它的适用性有些限制,所以如果你正在寻找“最好”的一般方法,并且你已经找到了它,我会说。
答
面向对象编程?
-- 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
看起来就好了。 – lhf 2013-05-03 14:25:45
那么,在某些情况下,可能会有更优雅的解决方案。例如,如果您从未使用该表进行单独查找,但只是对其进行迭代,则可以编写一个迭代器,该迭代器使用'keys'和'vals'并返回一个键和一个值,而不创建第三个表。如果那是你的用例,我可以把答案放在一起。但是如果你想为'kv'的所有可能的用法提供一个通用的解决方案,你的方法可能就是要走的路。 – 2013-05-04 00:06:13