在 Lua 表中键值对中使用“for each”循环

假设我定义了一个如下所示的表:

myTable = { myValue = nil, myOtherValue = nil}

我该如何像这样循环遍历它?

  for key,value in myTable do --伪代码
        value = "foobar"
  end

另外,如果有帮助的话,我并不关心键,只关心值。

点赞
用户734069
用户734069

没有值(即为nil)的键不存在。对于 Lua 而言,myTable 是一个空表。

你可以遍历一个空表,但是这不会有用。

此外:

for key,value in myTable do --伪代码
    value = "foobar"
end

这个“伪代码”没有意义。你不能通过修改局部变量的内容来修改表;Lua 不这么工作。你不能获取表条目的引用;你只能从表中获取一个值。

如果你想修改表的内容,你必须实际上修改 _表_。例如:

for key,value in pairs(myTable) do --实际代码
    myTable[key] = "foobar"
end

注意使用了 myTable。你不能不使用表本身修改表。无论是通过 myTable 访问的表,还是通过某个你存储表引用的其他变量访问的表。

通常情况下,在遍历表时修改表会导致问题。然而,Lua 说:

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

因此,修改已经存在的字段的值是完全有效的。key 很明显已经存在于表中,所以你可以修改它。你甚至可以将其设置为 nil 而没有问题。

在 Lua 中,变量仅仅是值的容器。表包含值;myTable[key] 返回一个值。你可以将那个值存储在一个变量中,但是改变变量将 不会 改变 myTable[key] 的值。由于表是按引用存储的,你可以更改一个变量中表的内容,并在另一个变量中看到更改,但这仅仅是表的 _内容_,而不是表本身。

2012-10-26 06:14:36