[手动选题][tech]: 20221104.7 ️ How to iterate over tables in Lua.md

This commit is contained in:
六开箱 2022-11-04 20:26:21 +08:00
parent 0f6e472971
commit 9c1b210970

View File

@ -0,0 +1,215 @@
[#]: 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