mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
Merge pull request #27831 from lkxed/20221104-7-How-to-iterate-over-tables-in-Lua
[手动选题][tech]: 20221104.7 ⭐️ How to iterate over tables in Lua.md
This commit is contained in:
commit
8892d44738
184
sources/tech/20221104.7 ⭐️ How to iterate over tables in Lua.md
Normal file
184
sources/tech/20221104.7 ⭐️ How to iterate over tables in Lua.md
Normal file
@ -0,0 +1,184 @@
|
||||
[#]: 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
|
Loading…
Reference in New Issue
Block a user