2012-12-05 66 views
0

我有如下表:如何遍歷此表?

self.keytable = {} 
self.keytable.rotate_right = false 
self.keytable.rotate_left = false 
self.keytable.thrust = false 
self.keytable.brake = false 
self.keytable.fire = false 

我想通過表格來迭代每個值設置爲false,但我必須缺少的Lua的一些細微差別。我試過以下運氣:

for k,v in ipairs(self.keytable) do 
    v = false 
end 

在此先感謝您的幫助!

+0

迭代時好像沒有奏效,它通常有助於把打印語句中環看你做了什麼值(如果有的話)。在這種情況下,你不會得到任何可能是一個體面線索的輸出。 – Stomp

回答

2

我不完全確定你的意圖是在這裏,但使用非整數鍵時,你必須使用pairs()內置函數。 ipairs()只是用數字鍵來迭代表格,而在上面的例子中,您將在鍵表中爲非數字鍵賦予false。

,如果你想避免在鍵表來設置每個關鍵假像你在你的代碼示例做了,這樣的事情會做你想要的乾淨了一點:

local keytable = {} 
local keys = {"rotate_right", "rotate_left", "thrust", "brake", "fire"} 

for _,key in pairs(keys) do 
    keytable[key] = false 
end 

這會產生這樣的輸出時印刷:

thrust false 
brake false 
fire false 
rotate_left false 
rotate_right false 

上面的代碼剛剛超過字符串值迭代,然後將它們設置爲鍵而賦予它們的值爲false KEYTABLE。

+0

我認爲這是爲了某種遊戲來存儲輸入狀態,在本例中基本上重置所有按鍵的狀態(全部爲「未按下」)。 – Mario

5

我想遍歷整個表並將每個值設置爲false,但我必須缺少一些Lua的細微差別。我試過沒有運氣以下:

for k,v in ipairs(self.keytable) do 
    v = false 
end 

一樣容易明白爲什麼這是行不通的?

local v = self.keytable[rotate_right] 
v = false 

您的self.keytable[rotate_right]值複製到v。隨後向v寫入不同的值不會影響keytable中的值。

這就是所發生的事情在for循環,這相當於這個:

for k=1,#self.keytable do 
    local v = self.keytable[k] 
    v = false 
end 

如果你想更新keytable你需要寫的值:

for k=1,#self.keytable do 
    self.keytable[k] = false 
end 

或者,如果你使用ipairs(如在原來的循環):

for k,v in ipairs(self.keytable) do 
    self.keytable[k] = false 
end 
1

兩個其他的答案是均爲沒錯。

1)ipairs迭代整數鍵(你應該忘了它,它不會比循環的數字更好)。這裏你的鑰匙是字符串,所以你必須使用pairs。這裏是你的榜樣與它改寫:

for k,v in pairs(self.keytable) do 
    v = false 
end 

2)這仍然沒有因爲受到泥給出的理由工作:v是本地環路。其實你不需要它了,這裏是一個正確的版本:

for k in pairs(self.keytable) do 
    self.keytable[k] = false 
end