【问题标题】:How do we change the way print displays a table我们如何改变 print 显示表格的方式
【发布时间】:2015-06-20 18:42:31
【问题描述】:

假设我有如下一段代码

aTable = {aValue=1}
aTable_mt = {}
print(aTable)  

我必须做些什么才能让 Lua 打印类似 aTable current aValue = 1 而不是 table: 0x01ab1d2 的东西。

到目前为止,我已经尝试设置 __tostring 元方法,但 print 似乎没有调用它。是否有一些我遗漏的元方法或答案与元方法无关?

【问题讨论】:

    标签: lua lua-table metatable meta-method


    【解决方案1】:

    __tostring 工作:

    aTable = {aValue=1}
    local mt = {__tostring = function(t) 
                               local result = ''
                               for k, v in pairs(t) do
                                 result = result .. tostring(k) .. ' ' .. tostring(v) .. ''
                               end
                               return result
                             end}      
    
    setmetatable(aTable, mt)    
    
    print(aTable) 
    

    这将打印aValue 1(带有一个额外的空格,在实际代码中将其删除)。 aTable 部分不可用,因为aTable 是引用表的变量,而不是表本身的内容。

    【讨论】:

    • 哎呀,我忘了返回一个值!对此感到抱歉。
    【解决方案2】:

    我不确定您是如何设置元方法的,但以下代码为我打印了“字符串化”:

    local aTable = {a = 1, b = 2}
    setmetatable(aTable, {__tostring = function() return "stringified" end})
    print(aTable)
    

    【讨论】:

    • 哎呀,我忘了返回一个值!对此感到抱歉。
    【解决方案3】:

    如果您希望 lua 通常打印所有人类可读的表格,您可以 连接/覆盖打印功能:

    local orig_print = print
    
    print = function(...)
      local args = {...}
      for i,arg in ipairs(args) do
        if type(arg) == 'table' then
          args[i] = serialize(arg)
        end
      end
      orig_print(table.unpack(args))
    end
    

    serialize 可以是 serpent 或来自 here 的其他库

    请注意,这必须在加载任何其他模块/脚本之前完成。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多