2013-05-03 39 views
2

我有兩個表格,一個是鍵值,另一個是值。我加入他們來創建一個鍵值對錶。目前我正在使用一個循環。有沒有更好的辦法?製作鍵值對的表格

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

回答

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。這具有您不需要創建第三個表格的優點。你可能會爭辯說,而不是你正在創建一個閉包的表,但是如果你要使用pairs遍歷你的kv表,那麼pairs也只是一個迭代器來創建閉包。

另一個差別(這是否是一個優勢或劣勢還是取決於使用情況)是zipkv總是遍歷的keysvals當前狀態。因此,如果在創建迭代器之後但在循環中使用迭代器之前要更改它們,則始終會將兩個表的當前狀態一起壓縮。

所以這是一種情況,我可以想到,哪裏有一個稍微更優雅(和更有效)的解決方案,以解決您的問題。但它的適用性有些限制,所以如果你正在尋找「最好」的一般方法,並且你已經找到了它,我會說。

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