2015-04-15 4 views
3

Предполагая, что у меня есть кусок кода, например, следующийКак мы изменяем способ печати отображает таблицу

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

Что я должен сделать, чтобы сделать Lua печати что-то вроде aTable current aValue = 1 в отличие от table: 0x01ab1d2.

До сих пор я пробовал установить метатет __tostring, но он, похоже, не вызван print. Есть ли какой-то метаметод, который я потерял, или ответ не имеет ничего общего с метаметодами?

ответ

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 может быть serpent или какой-либо другой экспромты из here

Обратите внимание, что это должно быть сделано до загрузки любого другого модуля/скрипта.