如何在 Lua 中迭代表

创建结构,使其更容易查找存储的数据。
还没有读者喜欢这个。
Programming keyboard.

Opensource.com

Lua 编程语言中,数组被称为表。表在 Lua 中用于存储数据。如果您以结构化的方式存储大量数据,那么了解在需要时检索这些数据的选项非常有用。

在 Lua 中创建表

要在 Lua 中创建表,请使用任意名称实例化表

mytable = {}

您可以通过不同的方式在表中构造数据。您可以填充值,本质上是创建一个列表(在某些语言中称为列表

mytable = { 'zombie', 'apocalypse' }

或者您可以创建一个关联数组(在某些语言中称为映射字典)。您可以使用点表示法向表中添加任意键。您还可以以与向变量添加值相同的方式向该键添加值

myarray = {}
myarray.baz = 'happy'
myarray.qux = 'halloween'

您可以使用 assert() 函数添加验证

assert(myarray.baz == 'happy', 'unexpected value in myarray.baz')
assert(myarray.qux == 'halloween', 'unexpected value in myarray.qux')

现在您有两个表:列表样式的 mytable 和关联数组样式的 myarray

使用 pairs 迭代表

Lua 的 pairs() 函数从表中提取键值对。

print('pairs of myarray:')

for k,v in pairs(myarray) do
  print(k,v)
end

这是输出

pairs of myarray:
baz     happy
qux     halloween

如果表中没有键,Lua 会使用索引。例如,mytable 表包含值 zombieapocalypse。它不包含键,但 Lua 可以即兴发挥

print('pairs of mytable:')

for k,v in pairs(mytable) do
  print(k,v)
end

这是输出

1   zombie
2   apocalypse

使用 ipairs 迭代表

为了考虑到没有键的表很常见这一事实,Lua 还提供了 ipairs 函数。此函数提取索引和值

print('ipairs of mytable:')

for i,v in ipairs(mytable) do
  print(i,v)
end

在这种情况下,输出与 pairs 的输出相同

1   zombie
2   apocalypse

但是,请注意当您向 mytable 添加键值对时会发生什么

mytable.surprise = 'this value has a key'

print('ipairs of mytable:')

for i,v in ipairs(mytable) do
  print(i,v)
end

Lua 忽略键和值,因为 ipairs 仅检索索引条目

1   zombie
2   apocalypse

但是,键值对已存储在表中

print('pairs of mytable:')

for k,v in ipairs(mytable) do
  print(k,v)
end

输出

1          zombie
2          apocalypse
surprise   this value has a key

检索任意值

您不必迭代表即可从中获取数据。您可以通过索引或键调用任意数据

print('call by index:')
print(mytable[2])
print(mytable[1])
print(myarray[2])
print(myarray[1])

print('call by key:')
print(myarray['qux'])
print(myarray['baz'])
print(mytable['surprise'])

输出

call by index:
apocalypse
zombie
nil
nil

call by key:
halloween
happy
this value has a key

数据结构

有时,使用 Lua 表比尝试跟踪数十个单独的变量更有意义。一旦您了解如何在语言中构造和检索数据,您就有能力以有组织且安全的方式生成复杂的数据。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,通常同时进行。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.