Tables: Difference between revisions

From Legacy Roblox Wiki
Jump to navigationJump to search
>Ozzypig
m Text replacement - "<SyntaxHighlight code="lua">" to "<syntaxhighlight lang="lua">"
 
(56 intermediate revisions by 12 users not shown)
Line 1: Line 1:
A '''table''' is a useful way to store multiple values in one value. It is called a table because it acts like a grid with two columns:


{| border="1"
A {{type|table}} is a data type in Lua that is useful to store multiple values, including {{type|number|numbers}}, {{type|string|strings}}, {{type|function|functions}}, more {{type|table|tables}}, and much more. It is called a table because it acts like a grid with two columns:
 
{| class="wikitable"
! Key  !!Value
! Key  !!Value
|-
|-
Line 7: Line 8:
|}
|}


The ''key'' column is used to find a row in the table, and the ''value'' is the value that is stored in that row. Both the key and value can be any Lua value (numbers, strings, the values of variables, [[Part]]s etc., even other tables!) except [[nil]].
The ''key'' column is used to find a row in the table, and the ''value'' is the value that is stored in that row. Both the key and value can be any Lua value ({{type|number|numbers}}, {{type|string|strings}}, {{type|instance=Part|Parts}} etc., and even other tables) except {{nil}}. Lua tables do not have to use either {{type|number|numbers}}, {{type|string|strings}} or {{type|table|tables}} as keys. Any combination of key types can be used.
 
Another way to describe it is that by inputting the key, you receive the value. 
 
The # operator will return the amount of keys that are {{type|number|numbers}}.


__TOC__
== Arrays ==


==Creating a table==
An array is a list of values, stored in order. It is a table where the keys are sequential integers starting at 1, e.g. 1, 2, 3, 4. Arrays are useful for creating lists of things, such as a list of players with special permissions.


To create a table we use a pair of curly brackets ('''{}'''). We can then store the table in a [[variable]]:
===Creating arrays===


<pre>myTable = {}</pre>
Arrays are created with a pair of braces ({ and }, containing the values to store in the array separated by commas (,) or semicolons (;). The values can be of any type
<syntaxhighlight lang="lua">
local myArray = {"A string", 3.14159, Workspace.Part}
local myEmptyArray = {}
</syntaxhighlight>


When you use curly brackets to define a table, this is called a '''table literal''', which means you're defining a table right in your code. You're ''literally'' defining a table!
=== Reading from and writing to arrays ===


==Indexing a table==
To read from an array, add a pair of brackets ([ and ]) after the array, and put the number of the element you want inside it. The first element in the array is number 1
<syntaxhighlight lang="lua">
print(myArray[1])              --> A string
print(myArray[2])              --> 3.14159
print(myArray[3]:GetFullName()) --> Workspace.Part


Getting values into and out of a table is called ''indexing''. First we need the key for the row we want to get or change the value in. We write this in square brackets ('''[]''') after the table is in. For example, to get or change the row with the key 1 in the table <code>myTable</code>, we would write <code>myTable[1]</code>. We can then use this exactly like a [[variable]]: we can use its value in other places, or we can set it. For example, to store the string "A value" in <code>myTable</code> in the row with the key 1, we would write:
myArray[2] = "Pi"
print(myArray[2])               --> Pi
</syntaxhighlight>


<pre>myTable[1] = "A value"</pre>
===More information===


Now we can use <code>myTable[1]</code> in other places:
You can get the length of the array with the # operator:
<syntaxhighlight lang="lua">
print(#myArray)      --> 3
print(#myEmptyArray ) --> 0
</syntaxhighlight>


<pre>print(myTable[1]) -- prints: A value</pre>
Lua's [[Function_Dump/Table_Manipulation|table manipulation]] functions allow you to easily do things such as add and remove values from an array.


If there is already a row in the table with the key we're trying to set, the old one will be changed:
== Dictionaries ==
Dictionaries are an extension of arrays. While an array stores an ordered list of items, a dictionary stores a set of key/value pairs. For example, in a real dictionary, the "keys" are the words, and the "values" the definition.


<pre>myTable[1] = "A new value"
=== Creating a dictionary ===
print(myTable[1]) -- prints: A new value</pre>
Once again, dictionaries are created with braces
<syntaxhighlight lang="lua">
local myDictionary = {
["Roblox"] = "A massively multiplayer online game",
["Wiki"] = "A Web site developed collaboratively by a community of users",
["Lua"] = "A lightweight multi-paradigm programming language"
}
</syntaxhighlight>


If there isn't a row with the key we're using when we try to ''get'' a value, we will get [[nil]]:
Like arrays, dictionaries are not restricted to strings. Both the keys and the values can be of any type.


<pre>print(myTable[2]) -- prints: nil</pre>
<syntaxhighlight lang="lua">
local playerScores = {
[game.Players.Telamon] = "Over 9000!", 
[game.Players.ROBLOX] = 1337,
[game.Players.Sorcus] = Enum.DialogTone.Enemy
}
</syntaxhighlight>


== More on creating tables ==
====Shorthand for string keys====


We can add keys to the table while we are creating a table in a very similar way to indexing. Inside the curly brackets, we can put lines that are very similar to indexing, but without the name of the table, and separated by commas.
If a key in a dictionary is a string, and a valid Lua identifier (that is, it can be used as [[Variables#Names|the name of a variable]]), the quotes and brackets can be omitted:


<pre>
<syntaxhighlight lang="lua">
myOtherTable = {
local myDictionary = {
    [1] = "A value",
Roblox = "A massively multiplayer online game",
    ["A string key"] = "Another value",
Wiki = "A Web site developed collaboratively by a community of users",
    [2] = 5
Lua = "A lightweight multi-paradigm programming language"
}
}
print(myOtherTable[1], myOtherTable["A string key"], myOtherTable[2]) -- prints: A value Another value 5
</syntaxhighlight>
</pre>


''The commas are important!'' If they are not there, Lua will give an error message saying it expects the "}".
===Indexing a dictionary ===


== Arrays ==
Getting values into and out of a table is called ''indexing''. An ''index'' in a table is like a row in the table model above. To index something in a table, you first need the key for the index you want to get or change the value in. You put the key in square brackets ('''[]''') after the table that that is to be looked in. For example, to get or change the index with the key 1 in the table myTable, we write myTable[1]. You can then use this exactly like a [[variable]] or value: it can be used, or set to a different value. For example, to store the string "A value" in myTable in the row with the key 1, we would write:


An array, or list, is a table were all the keys are whole numbers (e.g. 1, 2, 3, 4...). This is very useful for creating lists of things, such as a list of people who can use a tool.
<syntaxhighlight lang="lua">
myTable = {}
myTable[1] = "A value"
</syntaxhighlight>


When we are creating arrays, we can miss out the <code>["key"] =</code> part, and just write the values separated by commas, and Lua will automatically use the numbers 1, 2, 3, 4, 5... as the keys:
myTable[1] can now be used in other places. For example, the print function:


<pre>myArray = {"First value", "Second value", "Third value"}
<syntaxhighlight lang="lua">print(myTable[1]) --> A value</syntaxhighlight>
print(myArray[1]) -- prints: First value
print(myArray[2]) -- prints: Second value
print(myArray[3]) -- prints: Third value
</pre>


We can get the number of values in an array (but ''not'' a normal table, only number keys are counted) by using the '''#''' operator:
If there is already an index in the table with the key that is being set, the old value will be replaced with the new one:


<pre>print(#myArray) -- prints: 3</pre>
<syntaxhighlight lang="lua">
myTable[1] = "A new value"
print(myTable[1]) --> A new value (as apposed to "A value")
</syntaxhighlight>


Lua's [[Function_Dump/Table_Manipulation|table manipulation]] functions allow you to easily do things such as add and remove values from an array.
If there isn't a row with the key we're using when we try to ''get'' a value, it will return {{nil}}:


'''Note''': Normally, [[nil]] should not be used as a value in an array. # and Lua's table manipulation functions use nil to tell where an array ends. Putting them in the middle of your table may make Lua think the array ends there.
<syntaxhighlight lang="lua">print(myTable[2]) --> nil</syntaxhighlight>


== Loops through tables ==
== Iteration through tables ==


We can use the [[Function_Dump/Core_Functions#pairs_.28t.29|pairs]] and [[Function_Dump/Core_Functions#ipairs_.28t.29|ipairs]] functions to write a loop that goes through every value in an array:
''Iteration'' is the repetition of an action. In this case, you are iterating through the values in a table by taking each value and doing something with it. For-loops (and sometimes while-loops) are used to iterate with tables. You can use the [[Function_Dump/Core_Functions#pairs_.28t.29|pairs]] (or [[Function_Dump/Core_Functions#ipairs_.28t.29|ipairs]] if you only want to iterate over the number keys) function to write a for-loop that goes through every value in a table with the value's key.


<pre>for key, value in pairs(myOtherTable) do
<syntaxhighlight lang="lua">
    print(key, "=", value)
for key, value in pairs(myOtherTable) do
print(key, "=", value)
end
end


Outputs:
--[[
Output:
1 = A value
1 = A value
A string key = Another value
A string key = Another value
2 = 5</pre>
2 = 5
 
]]
<pre>for key, value in ipairs(myArray) do
</syntaxhighlight>
    print(key, "=", value)
end
 
Outputs:
1 = First value
2 = Second value
3 = Third value</pre>
 
The difference between pairs and ipairs is that ipairs is designed for arrays - it only goes through the keys 1, 2, 3... until it finds a nil value. pairs goes through all the keys, but might not go through them in a set order.


== Pass by reference ==
== Pass by reference ==


An important thing to understand when setting more than one variable to the same table is that tables are ''passed by reference''. This means that the variable doesn't directly contain the table itself, but that it holds a ''reference'' to it. This means that when more than one variable is set to a table, the variables ''don't'' each have a copy of the table, they refer to the same table, so any changes will be noticed by ''both'' variables:
An important thing to understand when setting more than one variable to the same table is that tables are ''passed by reference''. This means that the variable doesn't directly contain the table itself, but that it holds a ''reference'' (or pointer) to it. This means that when more than one variable is set to a table, the variables ''do not'' each have a copy of the table, they refer to the same table, so any changes will be noticed by ''both'' variables:


<pre>var1 = {}
<syntaxhighlight lang="lua">
var1 = {}
var2 = var1
var2 = var1
var2["key"] = "value"
var2["key"] = "value"
print(var1["key"]) -- prints "value"!
print(var1["key"]) -- prints "value" because var2 had pointed to var1's value (the table)
</pre>
</syntaxhighlight>
 
== See Also ==
 
[[Metatables]]
 
[http://www.lua.org/pil/2.5.html 2.5 - Tables]


[http://www.lua.org/pil/2.5.html 3.6 - Table Constructors]
== See also ==


[http://www.lua.org/pil/11.2.html 11.2 - Matrices and Multi-Dimensional Arrays]
* [[Metatables]]
[[Category:Data Types]]
* From Programming in Lua:
** [http://www.lua.org/pil/2.5.html 2.5 - Tables]
** [http://www.lua.org/pil/2.5.html 3.6 - Table Constructors]
** [http://www.lua.org/pil/11.2.html 11.2 - Matrices and Multi-Dimensional Arrays]
* [http://lua-users.org/wiki/TablesTutorial Tables Tutorial] on Lua Users wiki
* Using Tables to create data structures:
** [[Linked lists]]
** [[Stack]]
[[Category:Data types]]

Latest revision as of 06:18, 27 April 2023

A table is a data type in Lua that is useful to store multiple values, including numbers, strings, functions, more tables, and much more. It is called a table because it acts like a grid with two columns:

Key Value
   

The key column is used to find a row in the table, and the value is the value that is stored in that row. Both the key and value can be any Lua value (numbers, strings, Parts etc., and even other tables) except nil. Lua tables do not have to use either numbers, strings or tables as keys. Any combination of key types can be used.

Another way to describe it is that by inputting the key, you receive the value.

The # operator will return the amount of keys that are numbers.

Arrays

An array is a list of values, stored in order. It is a table where the keys are sequential integers starting at 1, e.g. 1, 2, 3, 4. Arrays are useful for creating lists of things, such as a list of players with special permissions.

Creating arrays

Arrays are created with a pair of braces ({ and }, containing the values to store in the array separated by commas (,) or semicolons (;). The values can be of any type

local myArray = {"A string", 3.14159, Workspace.Part}
local myEmptyArray = {}

Reading from and writing to arrays

To read from an array, add a pair of brackets ([ and ]) after the array, and put the number of the element you want inside it. The first element in the array is number 1

print(myArray[1])               --> A string
print(myArray[2])               --> 3.14159
print(myArray[3]:GetFullName()) --> Workspace.Part

myArray[2] = "Pi"
print(myArray[2])               --> Pi

More information

You can get the length of the array with the # operator:

print(#myArray)       --> 3
print(#myEmptyArray ) --> 0

Lua's table manipulation functions allow you to easily do things such as add and remove values from an array.

Dictionaries

Dictionaries are an extension of arrays. While an array stores an ordered list of items, a dictionary stores a set of key/value pairs. For example, in a real dictionary, the "keys" are the words, and the "values" the definition.

Creating a dictionary

Once again, dictionaries are created with braces

local myDictionary = {
	["Roblox"] = "A massively multiplayer online game",
	["Wiki"] = "A Web site developed collaboratively by a community of users",
	["Lua"] = "A lightweight multi-paradigm programming language"
}

Like arrays, dictionaries are not restricted to strings. Both the keys and the values can be of any type.

local playerScores = {
	[game.Players.Telamon] = "Over 9000!",  
	[game.Players.ROBLOX] = 1337,
	[game.Players.Sorcus] = Enum.DialogTone.Enemy
}

Shorthand for string keys

If a key in a dictionary is a string, and a valid Lua identifier (that is, it can be used as the name of a variable), the quotes and brackets can be omitted:

local myDictionary = {
	Roblox = "A massively multiplayer online game",
	Wiki = "A Web site developed collaboratively by a community of users",
	Lua = "A lightweight multi-paradigm programming language"
}

Indexing a dictionary

Getting values into and out of a table is called indexing. An index in a table is like a row in the table model above. To index something in a table, you first need the key for the index you want to get or change the value in. You put the key in square brackets ([]) after the table that that is to be looked in. For example, to get or change the index with the key 1 in the table myTable, we write myTable[1]. You can then use this exactly like a variable or value: it can be used, or set to a different value. For example, to store the string "A value" in myTable in the row with the key 1, we would write:

myTable = {}
myTable[1] = "A value"

myTable[1] can now be used in other places. For example, the print function:

print(myTable[1]) --> A value

If there is already an index in the table with the key that is being set, the old value will be replaced with the new one:

myTable[1] = "A new value"
print(myTable[1]) --> A new value (as apposed to "A value")

If there isn't a row with the key we're using when we try to get a value, it will return nil:

print(myTable[2]) --> nil

Iteration through tables

Iteration is the repetition of an action. In this case, you are iterating through the values in a table by taking each value and doing something with it. For-loops (and sometimes while-loops) are used to iterate with tables. You can use the pairs (or ipairs if you only want to iterate over the number keys) function to write a for-loop that goes through every value in a table with the value's key.

for key, value in pairs(myOtherTable) do
	print(key, "=", value)
end

--[[
Output:
1 = A value
A string key = Another value
2 = 5
]]

Pass by reference

An important thing to understand when setting more than one variable to the same table is that tables are passed by reference. This means that the variable doesn't directly contain the table itself, but that it holds a reference (or pointer) to it. This means that when more than one variable is set to a table, the variables do not each have a copy of the table, they refer to the same table, so any changes will be noticed by both variables:

var1 = {}
var2 = var1
var2["key"] = "value"
print(var1["key"]) -- prints "value" because var2 had pointed to var1's value (the table)

See also