2015-04-15 18 views
3

假設我有一段代碼,如下面的我們怎麼改變打印的方式顯示錶

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

我必須做什麼,使Lua的打印類似aTable current aValue = 1,而不是table: 0x01ab1d2

到目前爲止,我試過設置__tostring metamethod,但似乎沒有被print調用。是否有一些metamethod我已經失蹤或答案是否與metamethods無關?

回答

2

__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是引用表的變量,而不是表本身的內容。

+0

啊,我的壞,我忘了返回一個值!對於那個很抱歉。 –

2

我不知道你如何設置元方法,但下面的代碼打印 「字符串化」 對我來說:

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

啊我的不好,我忘了返回一個值!對於那個很抱歉。 –

2

如果你想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可能是serpenthere

注意一些其他的LIB下這必須在任何其他模塊/腳本加載之前完成。