我有兩個表格,一個是鍵值,另一個是值。我加入他們來創建一個鍵值對錶。目前我正在使用一個循環。有沒有更好的辦法?製作鍵值對的表格
local keys={"fruit","bread","drink"}
local vals={"apple","french","milk"}
local kv={}
for i=1,#keys do
kv[keys[i]]=vals[i]
end
我有兩個表格,一個是鍵值,另一個是值。我加入他們來創建一個鍵值對錶。目前我正在使用一個循環。有沒有更好的辦法?製作鍵值對的表格
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