制作键值对的表格

问题描述:

我有两个表格,一个是键值,另一个是值。我加入他们来创建一个键值对表。目前我正在使用一个循环。有没有更好的办法?制作键值对的表格

local keys={"fruit","bread","drink"} 
local vals={"apple","french","milk"} 

local kv={} 
for i=1,#keys do 
    kv[keys[i]]=vals[i] 
end 
+4

看起来就好了。 – lhf 2013-05-03 14:25:45

+1

那么,在某些情况下,可能会有更优雅的解决方案。例如,如果您从未使用该表进行单独查找,但只是对其进行迭代,则可以编写一个迭代器,该迭代器使用'keys'和'vals'并返回一个键和一个值,而不创建第三个表。如果那是你的用例,我可以把答案放在一起。但是如果你想为'kv'的所有可能的用法提供一个通用的解决方案,你的方法可能就是要走的路。 – 2013-05-04 00:06:13

您没有回应我的评论,但无论如何,这是一个答案。

正如其他人所说的,你的代码对于通用的用例来说很好。特别是,如果您稍后要操作kvkeysvalues可能稍后会更改,并且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总是遍历的keysvals当前状态。因此,如果在创建迭代器之后但在循环中使用迭代器之前要更改它们,则始终会将两个表的当前状态一起压缩。

所以这是一种情况,我可以想到,哪里有一个稍微更优雅(和更有效)的解决方案,以解决您的问题。但它的适用性有些限制,所以如果你正在寻找“最好”的一般方法,并且你已经找到了它,我会说。

面向对象编程?

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