TranslateProject/sources/tech/20221104.7 ⭐️ How to iterate over tables in Lua.md

185 lines
4.4 KiB
Markdown
Raw Normal View History

[#]: subject: "How to iterate over tables in Lua"
[#]: via: "https://opensource.com/article/22/11/iterate-over-tables-lua"
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
[#]: collector: "lkxed"
[#]: translator: " "
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
How to iterate over tables in Lua
======
Create structure that makes it easier to find stored data.
In the [Lua][1] programming language, an array is called a table. A table is used in Lua to store data. If you're storing a lot of data in a structured way, it's useful to know your options for retrieving that data when you need it.
### Creating a table in Lua
To create a table in Lua, you instantiate the table with an arbitrary name:
```
mytable = {}
```
There are different ways you can structure your data in a table. You could fill it with values, essentially creating a list (called a list in some languages):
```
mytable = {'zombie','apocalypse'}
```
Or you could create an associated array (called a map or dictionary in some languages). You can add arbitrary keys to the table using dot notation. You can also add a value to that key the same way you add a value to a variable:
```
myarray = {}
myarray.baz = 'happy'
myarray.qux = 'halloween'
```
You can add verification with the `assert()` function:
```
[assert][2](myarray.baz == 'happy', 'unexpected value in myarray.baz')
[assert][2](myarray.qux == 'halloween', 'unexpected value in myarray.qux')
```
You now have two tables: a list-style `mytable` and an associative array-style `myarray`.
### Iterating over a table with pairs
Lua's `pairs()` function extracts key and value pairs from a table.
```
print('pairs of myarray:')
for k, v in pairs(myarray) do
  print(k, v)
end
```
Here's the output:
```
pairs of myarray:
baz     happy
qux     halloween
```
If there are no keys in a table, Lua uses an index. For instance, the `mytable` table contains the values `zombie` and `apocalypse`. It contains no keys, but Lua can improvise:
```
print('pairs of mytable:')
for k, v in pairs(mytable) do
  print(k, v)
end
```
Here's the output:
```
1   zombie
2   apocalypse
```
### Iterating over a table with ipairs
To account for the fact that tables without keys are common, Lua also provides the `ipairs` function. This function extracts the index and the value:
```
print('ipairs of mytable:')
for i, v in ipairs(mytable) do
  print(i, v)
end
```
The output is, in this case, the same as the output of `pairs`:
```
1   zombie
2   apocalypse
```
However, watch what happens when you add a key and value pair to `mytable`:
```
mytable.surprise = 'this value has a key'
print('ipairs of mytable:')
for i, v in ipairs(mytable) do
  print(i, v)
end
```
Lua ignores the key and value because `ipairs` retrieves only indexed entries:
```
1   zombie
2   apocalypse
```
The key and value pair, however, have been stored in the table:
```
print('pairs of mytable:')
for k, v in ipairs(mytable) do
  print(k, v)
end
```
The output:
```
1          zombie
2          apocalypse
surprise   this value has a key
```
### Retrieving arbitrary values
You don't have to iterate over a table to get data out of it. You can call arbitrary data by either index or 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'])
```
The output:
```
call by index:
apocalypse
zombie
nil
nil
call by key:
halloween
happy
this value has a key
```
### Data structures
Sometimes using a Lua table makes a lot more sense than trying to keep track of dozens of individual variables. Once you understand how to structure and retrieve data in a language, you're empowered to generate complex data in an organized and safe way.
--------------------------------------------------------------------------------
via: https://opensource.com/article/22/11/iterate-over-tables-lua
作者:[Seth Kenlon][a]
选题:[lkxed][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/seth
[b]: https://github.com/lkxed
[1]: https://opensource.com/article/22/11/lua-worth-learning
[2]: http://www.opengroup.org/onlinepubs/009695399/functions/assert.html