In Lua, you will commonly need to store items or references in a table, and sometimes it’s necessary to know which items/members exist inside that table. This is simple enough to do with a pairs() function:
local myTable = {
firstName = "Fred",
lastName = "Bob",
phoneNumber = "(555) 555-1212",
age = 30
}
for k,v in pairs(myTable) do
print( k,v )
end
This will output something like the following to the console:
firstName Fred age 30 lastName Bob phoneNumber (555) 555-1212
Note that the order may differ since the pairs() function does not necessarily iterate through the table in the same order in which the
What if your table has
local myTable = {
firstName = "Fred",
lastName = "Bob",
phoneNumber = "(555) 555-1212",
age = 30,
favoriteSports = { "Baseball", "Hockey", "Soccer" },
favoriteTeams = { "Cowboys", "Panthers", "Lightning" }
}
In this case, the pairs() loop method will output something like this:
firstName Fred favoriteSports table: 0x7fb1bbd00750 phoneNumber (555) 555-1212 favoriteTeams table: 0x7fb1bbd00340 lastName Bob age 30
As you can see, the loop will display the internal references to those tables, for example 0x7fb1bbd00750, but it won’t display the actual content
Fortunately, we can use a powerful function that will intelligently step through tables and
local function printTable( t )
local printTable_cache = {}
local function sub_printTable( t, indent )
if ( printTable_cache[tostring(t)] ) then
print( indent .. "*" .. tostring(t) )
else
printTable_cache[tostring(t)] = true
if ( type( t ) == "table" ) then
for pos,val in pairs( t ) do
if ( type(val) == "table" ) then
print( indent .. "[" .. pos .. "] => " .. tostring( t ).. " {" )
sub_printTable( val, indent .. string.rep( " ", string.len(pos)+8 ) )
print( indent .. string.rep( " ", string.len(pos)+6 ) .. "}" )
elseif ( type(val) == "string" ) then
print( indent .. "[" .. pos .. '] => "' .. val .. '"' )
else
print( indent .. "[" .. pos .. "] => " .. tostring(val) )
end
end
else
print( indent..tostring(t) )
end
end
end
if ( type(t) == "table" ) then
print( tostring(t) .. " {" )
sub_printTable( t, " " )
print( "}" )
else
sub_printTable( t, " " )
end
end
This function will navigate through the
printTable( myTable )
In this case, the output becomes:
table: 0x600001260c00 {
[firstName] => "Fred"
[favoriteSports] => table: 0x600001260c00 {
[1] => "Baseball"
[2] => "Hockey"
[3] => "Soccer"
}
[phoneNumber] => "(555) 555-1212"
[favoriteTeams] => table: 0x600001260c00 {
[1] => "Cowboys"
[2] => "Panthers"
[3] => "Lightning"
}
[lastName] => "Bob"
[age] => 30
}
As you can see, this function makes the table contents significantly easier to read! Also, when applicable, it shows the index value of [2] => "Hockey"
Since this function is for outputting table contents, it may not be intuitive to use it directly as in:
printTable( myTable )
Thus, an alternative is to add the printTable() function to the Lua table library object as so:
table.print = printTable
Then, calling it via the reference becomes more sensible:
table.print( myTable )
Using tables to store items and references is focal to any serious development in Lua and Corona, and knowing the content of those tables is often essential to debugging. Hopefully this convenience function will help you throughout the course of your development!