【问题标题】:"For each" loop in a lua table with key value pairs具有键值对的 lua 表中的“For each”循环
【发布时间】:2012-10-16 09:44:30
【问题描述】:

假设我有一个这样定义的表:

myTable = { myValue = nil, myOtherValue = nil}

我将如何在这样的 for each 时尚循环中迭代它?

  for key,value in myTable do --pseudocode
        value = "foobar"
  end

另外,如果它有帮助,我并不真正关心密钥,只关心价值。

【问题讨论】:

    标签: lua lua-5.2


    【解决方案1】:

    没有值的键(即:nil)不存在。就 Lua 而言,myTable 是一个 表。

    您可以遍历一个空表,但这没有用。

    此外:

    for key,value in myTable do --pseudocode
        value = "foobar"
    end
    

    这个“伪代码”毫无意义。不能通过修改局部变量的内容来修改表; Lua 不是这样工作的。您无法获得对表条目的引用;你只能从表中得到一个

    如果要修改表格的内容,则必须实际修改表格。例如:

    for key,value in pairs(myTable) do --actualcode
        myTable[key] = "foobar"
    end
    

    注意myTable 的使用。在某些时候,如果不使用表本身,就无法修改表。无论是通过myTable 访问的表,还是通过其他变量存储对表的引用。

    一般来说,在迭代表时修改表可能会导致问题。然而,Lua 说:

    next 的行为是未定义的,如果在遍历期间,您将任何值分配给表中不存在的字段。但是,您可以修改现有字段。特别是,您可以清除现有字段。

    所以修改已经存在的字段的值是完全有效的。而key显然已经存在于表中,可以修改。您甚至可以毫无问题地将其设置为nil

    Lua 中的变量只不过是值的持有者。表格包含值; myTable[key] 返回一个值。您可以将该值存储在变量中,但更改变量不会更改myTable[key] 的值。由于表是通过引用存储的,因此您可以在一个变量中更改表的内容并查看另一个变量中的更改,但这只是表的内容,而不是表本身。

    【讨论】:

    • 我要补充一点,在你用来解析它的同一个循环中修改一个表在 Lua 中被认为是“未定义的行为”。它可能适用于一个 Lua 实现,但不适用于其他实现。还有更安全的替代方法,例如使用辅助表来记录更改,然后对其进行解析以应用它们。
    • @kikito:在这种情况下不是。我已经更新了帖子来解释。
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多