【问题标题】:get nested table result in lua在lua中获取嵌套表结果
【发布时间】:2011-02-09 02:40:09
【问题描述】:

我有一个包含以下内容的表 A

for i,v in pairs(Table A) do print (i,v) end

1    a
2    table : 50382A03     -- table B
3    hi 

。有没有办法让我在打印父表 A 时打印出表 B 的值,或者我可以存储它并使用相同的函数再次打印它?。

谢谢 日本人

【问题讨论】:

    标签: lua


    【解决方案1】:

    当问题包含“嵌套”时,答案可能会包含递归:

    function printTable(t)
    
        function printTableHelper(t, spacing)
            for k,v in pairs(t) do
                print(spacing..tostring(k), v)
                if (type(v) == "table") then 
                    printTableHelper(v, spacing.."\t")
                end
            end
        end
    
        printTableHelper(t, "");
    end
    

    请注意循环引用。

    【讨论】:

    • 另见 Lua 现场演示中的globals 程序:lua.org/demo.html
    • 你总是可以使用现成的工具来做这个 - 我喜欢 penlight: print(require('pl.pretty').write(table)) 将打印所有表格,无论是否有循环并制作输出漂亮;P
    【解决方案2】:

    为了更好的输出和抽象而稍微改变了函数:

    function printTableHelper(t,spacing)
        local spacing = spacing or ''
    
        if type(t)~='table' then
            print(spacing..tostring(t))
        else
            for k,v in pairs(t) do
                print(spacing..tostring(k),v)
                if type(v)=='table' then 
                    printTableHelper(v,spacing..'\t')
                end
            end
        end
    end
    
    printTableHelper({'a',{'b'},'c'})
    

    【讨论】:

      【解决方案3】:

      只需前往table serialization 上的 lua-users wiki 页面并选择您的冠军。例如,以下代码处理包括表中的循环在内的所有内容 (local a={}; a.t = a):

      -- alt version2, handles cycles, functions, booleans, etc
      --  - abuse to http://richard.warburton.it
      -- output almost identical to print(table.show(t)) below.
      function print_r (t, name, indent)
        local tableList = {}
        function table_r (t, name, indent, full)
          local serial=string.len(full) == 0 and name
              or type(name)~="number" and '["'..tostring(name)..'"]' or '['..name..']'
          io.write(indent,serial,' = ') 
          if type(t) == "table" then
            if tableList[t] ~= nil then io.write('{}; -- ',tableList[t],' (self reference)\n')
            else
              tableList[t]=full..serial
              if next(t) then -- Table not empty
                io.write('{\n')
                for key,value in pairs(t) do table_r(value,key,indent..'\t',full..serial) end 
                io.write(indent,'};\n')
              else io.write('{};\n') end
            end
          else io.write(type(t)~="number" and type(t)~="boolean" and '"'..tostring(t)..'"'
                        or tostring(t),';\n') end
        end
        table_r(t,name or '__unnamed__',indent or '','')
      end
      

      【讨论】:

        猜你喜欢
        • 2020-05-05
        • 2014-08-27
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2022-11-23
        • 2015-01-18
        • 2017-10-02
        相关资源
        最近更新 更多