制作键值对表

时间:2013-05-03 14:19:22

标签: lua lua-table

我有两个表,一个是键,另一个是值。我和他们一起创建了一个键值对表。目前我正在使用循环。还有更好的方法吗?

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

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

2 个答案:

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

你没有回复我的评论,但无论如何这里都是答案。

正如其他人所说,您的代码适用于通用用例。特别是,如果您希望稍后操作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。这样做的好处是您不需要创建第三个表。您可以争辩说,您正在创建一个闭包而不是表,但如果您使用kv遍历pairs表,那么pairs只是一个创建闭包的迭代器也是。

另一个区别(这是优势还是劣势取决于用例)是zipkv将始终迭代当前状态keysvals。因此,如果您在创建迭代器后更改它们,但在循环中使用迭代器之前,您将始终将两个表的当前状态压缩在一起。

所以这是一个案例,我可以想到,哪里有一个更优雅(更有效)的问题解决方案。但它的适用性有些限制,所以如果你正在寻找“最佳”的一般方法,而你已经找到它,我会说。