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

185 lines
4.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: 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