mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
185 lines
4.4 KiB
Markdown
185 lines
4.4 KiB
Markdown
[#]: 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
|