创建键值对表格

我有两个表,一个存储 key,另一个存储 value。我通过连接它们来创建一个 key-value 对的表。目前我正在使用一个循环。是否有更好的方法?

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

local kv={}
for i=1,#keys do
  kv[keys[i]]=vals[i]
end
点赞
用户1633117
用户1633117

你没有回复我的评论,但是我还是给你一个答案。

正如其他人所说,你的代码对于一般情况来说是没问题的。特别是,如果你想后续操作kv,或者keysvalues可能会在之后改变,而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的当前状态。所以,如果你在创建迭代器之后改变它们,但在使用迭代器循环之前,你总是会将两个表的当前状态一起压缩。

所以,这是我能想到的一个情况,其中有一个稍微更优雅(且更有效率)的解决方案。但它在适用性上有所限制,所以如果你正在寻找“最佳”的通用方法,并且你已经找到了,那我会说:这个就可以了。

2013-05-05 22:48:20
用户3256255
用户3256255

面向对象编程?

-- 你也可以用一行代码实现,但这样更美观。
local kv = {fruit = "apple",
            bread = "french",
            drink = "milk"}

print(kv["fruit"])
print(kv.bread) -- 也可以
for index, value in pairs(kv) do -- 或者你可以用 for 循环实现
    print("index:", index, "value:", value)
end

你将会得到:

apple
french
index:  bread   value:  french
index:  fruit   value:  apple
index:  drink   value:  milk
2014-08-04 02:39:22