输出表格内容

在 Lua 中,您通常需要在表格中存储项目或引用,有时还需要知道此表格中存在哪些项目/成员。使用键值循环,使用 Lua pairs() 函数,就能轻松实现此目的

local myTable = {
    firstName = "Fred",
    lastName = "Bob",
    phoneNumber = "(555) 555-1212",
    age = 30
}

for k,v in pairs(myTable) do
    print( k,v )
end

此操作会向控制台输出以下内容

firstName   Fred
age 30
lastName    Bob
phoneNumber (555) 555-1212

请注意,顺序可能有所不同,因为 pairs() 函数不一定按键值被声明时的顺序来迭代表格。但是,如果您仅需要检查键是否存在及其值,则此循环方法完全可以接受。

子表格怎么办?

如果表格具有子表格(如下例所示)会怎样?

local myTable = {
    firstName = "Fred",
    lastName = "Bob",
    phoneNumber = "(555) 555-1212",
    age = 30,
    favoriteSports = { "Baseball", "Hockey", "Soccer" },
    favoriteTeams  = { "Cowboys", "Panthers", "Lightning" }
}

在这种情况下,pairs() 循环方法将输出类似以下内容

firstName   Fred
favoriteSports  table: 0x7fb1bbd00750
phoneNumber (555) 555-1212
favoriteTeams   table: 0x7fb1bbd00340
lastName    Bob
age 30

如您所见,循环将显示对这些表格的内部引用,例如 0x7fb1bbd00750,但不会显示(键或值)的实际内容子表格.

便捷函数

幸运的是,我们可以使用强大的函数,它将智能地遍历表格子表格,显示内容以供参考。以下是完整的函数

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

此函数将遍历表格/子表格并输出内容。要使用它,只需调用此函数并传入要输出的表格引用,例如

printTable( myTable )

在这种情况下,输出变为

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
}

如您所见,此函数使表格内容变得更易读!此外,在适用时,它还显示非键表格内项目的索引值,例如[2] => "Hockey",在应用程序中关联代码中访问表格内容时,这非常有用。

替代参考

由于此函数用于输出表格内容,因此直接使用它可能不合直觉,例如

printTable( myTable )

因此,替代方法是将 printTable() 函数添加到 Lua table 库对象中,如下所示

table.print = printTable

然后,通过引用调用它会更加合理

table.print( myTable )

结论

使用表格来存储项目和引用对于在 Lua 和 Corona 中进行任何认真的开发至关重要,并且了解这些表格的内容通常对于调试至关重要。希望此便捷函数能帮助您完成开发过程!