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

提前感谢您的帮助!

4

3 回答 3

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
于 2012-12-05T22:34:29.147 回答
2

我不确定您的意图是什么,但是在使用非整数键时,您必须使用pairs() 内置函数。ipairs() 仅用于使用数字键迭代表,在上面的示例中,您将 false 分配给 keytable 中的非数字键。

如果您想避免像在代码示例中那样将 keytable 中的每个键设置为 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

上面的代码只是遍历字符串值,然后将它们设置为 keytable 的键,同时为它们分配值 false。

于 2012-12-05T21:56:31.710 回答
1

另外两个答案都是的。

1)ipairs迭代整数键(无论如何你都应该忘记它,它并不比数字 for 循环好)。在这里,您的键是字符串,因此您必须使用pairs. 这是用它重写的示例:

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

2)由于 Mud 给出的原因,这仍然不起作用:v是循环的本地。其实你根本不需要它,这是一个正确的版本:

for k in pairs(self.keytable) do
  self.keytable[k] = false
end
于 2012-12-06T10:04:45.780 回答