Как мы изменим способ отображения таблицы

Предполагая, что у меня есть кусок кода, такой как следующий

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

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

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

3 ответа

Решение

__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 переменная, которая ссылается на таблицу, а не на содержимое самой таблицы.

Если вы хотите, чтобы 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 отсюда может быть змея или какая-то другая библиотека

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

Я не уверен, как вы устанавливаете метаметод, но следующий код выводит "stringified" для меня:

local aTable = {a = 1, b = 2}
setmetatable(aTable, {__tostring = function() return "stringified" end})
print(aTable)
Другие вопросы по тегам