【问题标题】:How do I iterate through this table?我如何遍历这个表?
【发布时间】:2012-12-06 18:04:45
【问题描述】:

我有下表:

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

提前感谢您的帮助!

【问题讨论】:

  • 当迭代似乎不起作用时,将 print 语句放入循环中以查看您获得的值(如果有)通常会有所帮助。在这种情况下,您不会得到任何可以作为不错线索的输出。

标签: lua


【解决方案1】:

我想遍历表并将每个值设置为 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

【讨论】:

    【解决方案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。

    【讨论】:

    • 我认为是某种游戏来存储输入状态,在这个例子中基本上是重置所有键的状态(全部为“未按下”)。
    【解决方案3】:

    另外两个答案都是对的。

    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
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多