25

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

myTable = { myValue = nil, myOtherValue = nil}

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

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

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

4

1 回答 1

55

没有值的键(即: are 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]. 由于表是通过引用存储的,因此您可以在一个变量中更改表的内容并查看另一个变量中的更改,但这只是表的内容,而不是表本身。

于 2012-10-26T06:14:36.410 回答